如何知道是否可以创建未知文件而不尝试创建并捕获IOException

问题描述:

我知道这个问题之前已经被问到过(实际上,我发现了或多或少相同问题的许多实例,但没有令人满意的解决方案),但我要重写它有点不同。 我想使用FileInfo来获取是否可以在特定磁盘(硬盘/ USB卡/等)上创建(新)文件的指示。和目录。如何知道是否可以创建未知文件而不尝试创建并捕获IOException

目前的问题我面对:

  1. 如果我要创建的文件位于写保护磁盘/ USB卡的/ etc上。 - 抛出一个IOException,只是问题在于它会在一定的延迟之后抛出(可能在调用Flush()之后)

  2. 由于我想创建的文件不存在,FileInfo.IsReadOnly会总是返回true,即使给定的路径实际上没有写保护! 只有在文件已存在且不是只读的情况下,它才会返回false。

那么我怎么能知道是否有可能创建一个特定的文件之前,试图实际创建它?

谢谢..

+0

你想检查文件是否存在?或者你想检查文件是否存在并且是写保护的(意思是只读)? – 2011-02-16 12:06:57

+0

@sachin:他想检查是否可以在磁盘上创建一个文件,而不需要创建它..没有延迟。 – 2011-02-16 12:12:02

+0

就像@Levisaxos说的。 – programmer 2011-02-16 12:38:42

在一般情况下没有。即使你可以在你做检查和你尝试创建文件之间改变条件。例如。用户删除拇指驱动器或某人更改文件权限。

但是,您可以通过查看父目录的DirectoryInfo来建立一个相当不错的估计。
检查DirectoryInfo.AttributesFileAttributes.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); 
    } 

但正如另一个答案所指出的那样,实际上并不能保证当你从“确认”中返回时,在下一次写作之前不会发生改变情况的有效性的事情。