使用IsolatedStorage,创建它之前是否需要检查目录是否存在?
问题描述:
我正在研究Windows Phone 7应用程序,我想知道是否有人对创建一个目录时是否需要检查目录是否存在确定性的答案以及做/不做的优缺点也是。据我所知,从通过我的单步执行代码,代码工作的以下两个块相同的方式:使用IsolatedStorage,创建它之前是否需要检查目录是否存在?
using (IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
//ensure directory exists
String sDirectory = System.IO.Path.GetDirectoryName(sPath);
if (!appStorage.DirectoryExists(sDirectory))
{
appStorage.CreateDirectory(sDirectory);
}
}
和
using (IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
//ensure directory exists
String sDirectory = System.IO.Path.GetDirectoryName(sPath);
appStorage.CreateDirectory(sDirectory);
}
是可以安全使用的代码的第二块?它似乎没有抛出异常,如果目录已经存在,并且似乎只留下目录的内容。
答
IsolatedStorageFile.CreateDirectory
将在内部调用Directory.CreateDirectory
。的Directory.CreateDirectory
的documentation指出:
如果该目录已经存在,这 方法不起作用。
换句话说,你不需要检查该目录是否存在。该方法已经为你做了。
答
我怀疑在内部CreateDirectrory
正在检查目录是否已经存在或正吞咽异常。无论哪种方式,从手头明确调用DirectoryExists
可能会带来很小的性能优势。
确定测试的方法是通过创建大量目录来对2种方法的性能进行基准测试。 (如果您尝试这样做,请注意您的父目录中不能有超过16k个目录,并且不能超过18个(我认为)目录深度。)
最好的做法是明确你在做什么。我希望任何其他查看代码的开发人员都会问你,在创建目录之前,你没有测试存在。特别是如果这个代码被多次调用。如果您测试并发现性能没有任何差异,我会建议在代码中注释以说明这一点。
我发誓之前,我问过这个问题,我一定要错过它 - 深夜编程的乐趣:) – 2010-09-20 13:19:55
不,你没有错。它不在'IsolatedStorageFile.CreateDirectory'文档中。它在'Directory.CreateDirectory'文档中。然而'IsolatedStorageFile'调用'Directory'可以被称为实现细节并且可以改变。但即使内部发生变化,微软也必须确保当目录已经存在时,'IsolatedStorageFile'不会引发异常,因为这将是一种行为上的(因此是破坏性的)改变。因此它只是简单介绍一下,它没有描述这一点。也许你可以把它报告给微软。 – Steven 2010-09-20 13:52:53