Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何知道是否可以创建不存在的文件,而无需尝试创建它并捕获IOException_C#_File - Fatal编程技术网

C# 如何知道是否可以创建不存在的文件,而无需尝试创建它并捕获IOException

C# 如何知道是否可以创建不存在的文件,而无需尝试创建它并捕获IOException,c#,file,C#,File,我知道以前有人问过这个问题,事实上,我发现了很多或多或少相同的问题,但还没有令人满意的解决方案,但我要换一种说法。。 我想使用FileInfo来指示是否可以在特定的硬盘/usb卡/等和目录上创建新文件 我目前面临的问题是: 如果我要创建的文件位于写保护磁盘/USB卡/等上-将引发IOException,唯一的问题是它将在一定延迟后引发,可能是在调用刷新后 由于我要创建的文件不存在,因此FileInfo.IsReadOnly将始终返回true,即使给定的路径实际上没有写保护! 仅当文件已存在且不是

我知道以前有人问过这个问题,事实上,我发现了很多或多或少相同的问题,但还没有令人满意的解决方案,但我要换一种说法。。 我想使用FileInfo来指示是否可以在特定的硬盘/usb卡/等和目录上创建新文件

我目前面临的问题是:

如果我要创建的文件位于写保护磁盘/USB卡/等上-将引发IOException,唯一的问题是它将在一定延迟后引发,可能是在调用刷新后

由于我要创建的文件不存在,因此FileInfo.IsReadOnly将始终返回true,即使给定的路径实际上没有写保护! 仅当文件已存在且不是只读文件时,才会返回false

那么,在尝试实际创建特定文件之前,我如何知道是否可以创建它呢


谢谢。

一般不需要。即使可以,在您执行检查和尝试创建文件之间,条件可能会发生变化。例如,用户删除了thumb驱动器或有人更改了文件权限

但是您可以通过查看父目录的。 检查FileAttributes.ReadOnly并遍历中的所有ACL:s,以确定当前用户是否具有足够的权限


我想只创建文件并捕获异常要容易得多。

通常不会。即使可以,在执行检查和尝试创建文件之间,条件可能会发生变化。例如,用户删除了thumb驱动器或有人更改了文件权限

但是您可以通过查看父目录的。 检查FileAttributes.ReadOnly并遍历中的所有ACL:s,以确定当前用户是否具有足够的权限


我想创建文件并捕获异常要容易得多。

这让我很感兴趣,可以尝试一下,尽管根本没有进行彻底或大量的测试,下面是一些您可能也希望与lookout for exception一起工作的事情!:

    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);
    }

但正如另一个答案所述,当你真正从“验证”中返回时,确实无法保证在你下一次写作之前不会有什么事情改变情况的有效性。

这引起了我足够的兴趣,让我尝试一下,尽管根本没有进行彻底或大量的测试,以下是一些您可能也希望与lookout for Exception一起使用的东西!:

    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);
    }

但正如另一个答案中所述,当您实际从“验证”返回时,确实无法保证在您下一次写入操作之前不会发生更改情况有效性的情况。

是否要检查文件是否存在?或者你想检查文件是否存在,并且是写保护的,即只读?@sachin:他想检查是否可以在磁盘上创建文件而不创建它。。立即。要检查文件是否存在吗?或者你想检查文件是否存在,并且是写保护的,即只读?@sachin:他想检查是否可以在磁盘上创建文件而不创建它。。您能提供一个遍历示例吗?对于我和其他SO读者:您能提供一个遍历示例吗?对我和其他SO读者来说:这实际上不起作用,因为执行“new DirectoryInfof:\\.Attributes”将生成一个FileAttributes枚举,该枚举只具有“Directory”标志,而不具有“ReadOnly”标志,即使“f:\'是只读闪存卡,并且您希望只读标志也会出现。这实际上不起作用,因为执行“new DirectoryInfof:\\.Attributes”将生成一个FileAttributes枚举,该枚举只具有“Directory”标志,而不具有“ReadOnly”标志,即使“f:\'是只读闪存卡,并且您希望只读标志也会出现。