我正在处理目录和文件的TreeView。用户可以选择一个文件或目录,然后对其进行操作。这要求我有一个方法,根据用户的选择执行不同的操作。

目前,我正在做这样的事情,以确定路径是文件还是目录:

bool bIsFile = false;
bool bIsDirectory = false;

try
{
    string[] subfolders = Directory.GetDirectories(strFilePath);

    bIsDirectory = true;
    bIsFile = false;
}
catch(System.IO.IOException)
{
    bIsFolder = false;
    bIsFile = true;
}

我不禁觉得有更好的方法可以做到这一点!我希望找到一个标准的。net方法来处理这个问题,但我还没有能够这样做。是否存在这样的方法,如果不存在,确定路径是文件还是目录的最直接的方法是什么?


当前回答

我知道这游戏太迟了,但我还是想分享这个。如果你只是将路径作为字符串来处理,这很容易:

private bool IsFolder(string ThePath)
{
    string BS = Path.DirectorySeparatorChar.ToString();
    return Path.GetDirectoryName(ThePath) == ThePath.TrimEnd(BS.ToCharArray());
}

例如: ThePath == "C:\SomeFolder\File1.txt"将结束如下:

return "C:\SomeFolder" == "C:\SomeFolder\File1.txt" (FALSE)

另一个例子: ThePath == "C:\SomeFolder\"将结束如下:

return "C:\SomeFolder" == "C:\SomeFolder" (TRUE)

这也可以在没有后面的反斜杠的情况下工作: ThePath == "C:\SomeFolder"将结束如下:

return "C:\SomeFolder" == "C:\SomeFolder" (TRUE)

请记住,这只适用于路径本身,而不适用于路径和“物理磁盘”之间的关系……所以它不能告诉你路径/文件是否存在或类似的东西,但它肯定能告诉你路径是文件夹还是文件……

其他回答

使用这篇文章中所选的答案,我看了评论并给予了信任 @ŞafakGür, @Anthony和@Quinn Wilson,他们的信息让我得到了这个改进的答案,我写了并测试了:

    /// <summary>
    /// Returns true if the path is a dir, false if it's a file and null if it's neither or doesn't exist.
    /// </summary>
    /// <param name="path"></param>
    /// <returns></returns>
    public static bool? IsDirFile(this string path)
    {
        bool? result = null;

        if(Directory.Exists(path) || File.Exists(path))
        {
            // get the file attributes for file or directory
            var fileAttr = File.GetAttributes(path);

            if (fileAttr.HasFlag(FileAttributes.Directory))
                result = true;
            else
                result = false;
        }

        return result;
    }

也许是UWP c#

public static async Task<IStorageItem> AsIStorageItemAsync(this string iStorageItemPath)
    {
        if (string.IsNullOrEmpty(iStorageItemPath)) return null;
        IStorageItem storageItem = null;
        try
        {
            storageItem = await StorageFolder.GetFolderFromPathAsync(iStorageItemPath);
            if (storageItem != null) return storageItem;
        } catch { }
        try
        {
            storageItem = await StorageFile.GetFileFromPathAsync(iStorageItemPath);
            if (storageItem != null) return storageItem;
        } catch { }
        return storageItem;
    }

作为directory . exists()的替代方法,你可以使用file . getattributes()方法来获取文件或目录的属性,所以你可以创建一个像这样的helper方法:

private static bool IsDirectory(string path)
{
    System.IO.FileAttributes fa = System.IO.File.GetAttributes(path);
    return (fa & FileAttributes.Directory) != 0;
}

在填充包含该项的附加元数据的控件时,还可以考虑向TreeView控件的tag属性添加对象。例如,您可以为文件添加FileInfo对象,为目录添加DirectoryInfo对象,然后在tag属性中测试项目类型,以避免在单击项目时进行额外的系统调用以获取数据。

如果你想找到目录,包括那些标记为“hidden”和“system”的目录,试试这个(需要。net V4):

FileAttributes fa = File.GetAttributes(path);
if(fa.HasFlag(FileAttributes.Directory)) 

用这个怎么样?

if(File.Exists(data.path))
{
    // is file
}
else if(Directory.Exists(data.path))
{
   // is Folder 
}
else
{
   // invalid path
}

file。exists()如果不是文件将返回false即使目录确实存在,如果它返回true,我们就知道我们得到了一个文件,如果它返回false,我们就得到了一个目录或一个无效路径接下来我们用directory。exists()测试它是否是一个有效目录如果返回true,我们就有一个目录如果不是,它是一个无效路径。