如何知道是否可以创建未知文件而不尝试创建并捕获IOException
问题描述:
我知道这个问题之前已经被问到过(实际上,我发现了或多或少相同问题的许多实例,但没有令人满意的解决方案),但我要重写它有点不同。 我想使用FileInfo来获取是否可以在特定磁盘(硬盘/ USB卡/等)上创建(新)文件的指示。和目录。如何知道是否可以创建未知文件而不尝试创建并捕获IOException
目前的问题我面对:
如果我要创建的文件位于写保护磁盘/ USB卡的/ etc上。 - 抛出一个IOException,只是问题在于它会在一定的延迟之后抛出(可能在调用Flush()之后)
由于我想创建的文件不存在,FileInfo.IsReadOnly会总是返回true,即使给定的路径实际上没有写保护! 只有在文件已存在且不是只读的情况下,它才会返回false。
那么我怎么能知道是否有可能创建一个特定的文件之前,试图实际创建它?
谢谢..
答
在一般情况下没有。即使你可以在你做检查和你尝试创建文件之间改变条件。例如。用户删除拇指驱动器或某人更改文件权限。
但是,您可以通过查看父目录的DirectoryInfo
来建立一个相当不错的估计。
检查DirectoryInfo.Attributes
为FileAttributes.ReadOnly
并遍历所有ACL中的s:DirectoryInfo.GetAccessControl()
以确定当前用户是否具有足够的权限。
我想只要尝试创建文件并捕获异常就容易多了。
答
这吸引了我,足以给它一个去,虽然没有彻底或太多的测试,在所有的,这里有几件事情你可能要使用(了望例外呢!):
static bool CanCreateFile(FileInfo fileInfo)
{
if (fileInfo.Exists) return false;
return !fileInfo.Attributes.HasFlag(FileAttributes.ReadOnly);
}
static bool CanCreateFile2(FileInfo fileInfo)
{
if (fileInfo.Exists) return false;
return IsDirectoryWriteable(
Path.GetDirectoryName(fileInfo.FullName));
}
static bool IsDirectoryWriteable(string path)
{
var directoryInfo = new DirectoryInfo(path);
if (!directoryInfo.Exists)
{
return IsDirectoryWriteable(directoryInfo.Parent.FullName);
}
return !directoryInfo.Attributes.HasFlag(FileAttributes.ReadOnly);
}
但正如另一个答案所指出的那样,实际上并不能保证当你从“确认”中返回时,在下一次写作之前不会发生改变情况的有效性的事情。
你想检查文件是否存在?或者你想检查文件是否存在并且是写保护的(意思是只读)? – 2011-02-16 12:06:57
@sachin:他想检查是否可以在磁盘上创建一个文件,而不需要创建它..没有延迟。 – 2011-02-16 12:12:02
就像@Levisaxos说的。 – programmer 2011-02-16 12:38:42