.NET如何检查path是一个文件,而不是一个目录?

我有一个path,我需要确定它是一个目录或文件。

这是确定path是否为文件的最好方法吗?

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

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

使用:

 System.IO.File.GetAttributes(string path) 

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

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

我认为这是最简单的方法,你只需要两个检查:

 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 } 

你可以用一些互操作代码来做到这一点:

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

为了进一步澄清一些意见…

在这个介绍非托pipe代码是没有比任何其他文件或I / O相关的.NET调用,因为他们ultimatley所有调用非托pipe代码inheritance危险。

这是一个使用string的单个函数调用。 调用此函数不会引入任何新的数据types和/或内存使用情况。 是的,您确实需要依赖非托pipe代码来进行正确的清理,但是您最终会依赖大部分与I / O相关的调用。

作为参考,这里是来自Reflector的File.GetAttributes(stringpath)的代码:

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

正如你所看到的,它也调用非托pipe代码来检索文件属性,所以关于引入非托pipe代码是非常危险的争论是无效的。 同样,关于完全停留在托pipe代码中的争论。 没有托pipe的代码实现来做到这一点。 即使调用File.GetAttributes()作为其他答案build议有调用unmanged代码相同的“问题”,我相信这是更可靠的方法来完成确定如果一个path是一个目录。

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

假设目录存在…

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

看一下这个:

 /// <summary> /// Returns true if the given file path is a folder. /// </summary> /// <param name="Path">File path</param> /// <returns>True if a folder</returns> public bool IsFolder(string path) { return ((File.GetAttributes(path) & FileAttributes.Directory) == FileAttributes.Directory); } 

http://www.jonasjohn.de/snippets/csharp/is-folder.htm

阅读文件属性:

 FileAttributes att = System.IO.File.GetAttributes(PATH_TO_FILE); 

检查号码簿标志。

假设一个特定的pathstring不能代表一个目录一个文件,那么下面的工作就好了,为其他操作打开了大门。

 bool isFile = new FileInfo(path).Exists; bool isDir = new DirectoryInfo(path).Exists; 

如果您正在使用文件系统,使用FileInfoDirectoryInfo比使用string要简单得多。

嗯,它看起来像Files类(在java.nio )实际上有一个静态isDirectory方法。 所以,我认为你可以使用以下内容:

 Path what = ... boolean isDir = Files.isDirectory(what);