当前位置:  开发笔记 > 程序员 > 正文

.NET如何检查路径是文件而不是目录?

如何解决《.NET如何检查路径是文件而不是目录?》经验,为你挑选了4个好方法。

我有一个路径,我需要确定它是一个目录或文件.

这是确定路径是否为文件的最佳方法吗?

string file = @"C:\Test\foo.txt";

bool isFile = !System.IO.Directory.Exists(file) && 
                         System.IO.File.Exists(file);

对于一个目录,我会颠倒逻辑.

string directory = @"C:\Test";

bool isDirectory = System.IO.Directory.Exists(directory) && 
                            !System.IO.File.Exists(directory);

如果两者都不存在那么我就不会去任何一个分支.所以假设它们都存在.



1> Alnitak..:

使用:

System.IO.File.GetAttributes(string path)

并检查返回的FileAttributes结果是否包含值FileAttributes.Directory:

bool isDir = (File.GetAttributes(path) & FileAttributes.Directory)
                 == FileAttributes.Directory;


只需确保在try/catch中执行此操作,因为路径可能甚至不存在.

2> Dirk Vollmar..:

我认为这是您只需要两次检查的最简单方法:

string file = @"C:\tmp";
if (System.IO.Directory.Exists(file))
{
    // do stuff when file is an existing directory
}
else if (System.IO.File.Exists(file))
{
    // do stuff when file is an existing file
}


这种方法的优点是即使文件系统中根本没有匹配的条目也可以工作(换句话说,它既不是文件夹也不是文件); 从这个意义上说,它"更简单".顺便提及,OP表示"路径",而不是"已知存在的路径".
是的,当你不确定你正在调查的路径是否存在时,我实际上认为这是更好的答案.不必担心捕获异常是一件大事.

3> Scott Dorman..:

您可以使用一些互操作代码执行此操作:

    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    [return: MarshalAsAttribute(UnmanagedType.Bool)]
    public static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);

进一步澄清一些评论......

在这里引入非托管代码不再比.NET中的任何其他文件或I/O相关调用更具危险性,因为它们最终都会调用非托管代码.

这是使用字符串的单个函数调用.您不是通过调用此函数来引入任何新数据类型和/或内存使用情况.是的,您确实需要依赖非托管代码来正确清理,但您最终会依赖大多数与I/O相关的调用.

作为参考,这里是Reflector的File.GetAttributes(字符串路径)的代码:

public static FileAttributes GetAttributes(string path)
{
    string fullPathInternal = Path.GetFullPathInternal(path);
    new FileIOPermission(FileIOPermissionAccess.Read, new string[] { fullPathInternal }, false, false).Demand();
    Win32Native.WIN32_FILE_ATTRIBUTE_DATA data = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA();
    int errorCode = FillAttributeInfo(fullPathInternal, ref data, false, true);
    if (errorCode != 0)
    {
        __Error.WinIOError(errorCode, fullPathInternal);
    }
    return (FileAttributes) data.fileAttributes;
}

正如您所看到的,它还调用非托管代码以检索文件属性,因此关于引入非托管代码的争论是无效的.同样,关于完全保留在托管代码中的论点.没有托管代码实现来执行此操作.即使调用File.GetAttributes()作为其他答案提出也有调用无人代码的相同"问题",我相信这是完成确定路径是否是目录的更可靠的方法.

编辑回答@Christian K关于CAS的评论.我相信GetAttributes提出安全需求的唯一原因是它需要读取文件的属性,以便确保调用代码有权这样做.这与底层操作系统检查(如果有)不同.您始终可以围绕对PathIsDirectory的P/Invoke调用创建包装函数,如果需要,还需要某些CAS权限.


这就是SO的"美丽",即使是一些好的答案也可能被一些狂热者贬低;)
这似乎是分配工作来确定路径是文件还是目录.
我不明白为什么这会被低估,尽管只使用.NET功能来保持托管代码要简单得多.

4> tvanfosson..:

假设目录存在...

bool isDir = (File.GetAttributes(path) & FileAttributes.Directory)
                  == FileAttributes.Directory;

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有