0

我知道过去曾问过几个类似的问题,我也知道我可以使用Directory.Exists()File.Exists()或使用 API 调用检查文件系统,但我试图仅根据输入字符串做出此决定。

public bool ValidateOutputFilename ( string sPath )
{
    // check if sPath is actually a filename
}

我的猜测是这是不可能的,因为看起来像文件夹名称(没有扩展名但没有尾随\)的东西实际上可能是一个文件(例如C:\A\B\C可能代表一个文件或文件夹,反之亦然)。

我想避免文件系统检查的原因是因为路径可能/可能不存在并且sPath可能代表网络位置,在这种情况下文件系统查询会很慢。

我希望有人可以推荐一个我还没有考虑过的想法。

4

2 回答 2

2

我认为您无法避免文件系统调用。
只有文件系统才能确定。
正如您所说,一个简单的、格式良好的字符串是无法识别为路径或文件的。

回答您的问题的一种方法是通过File.GetAttributes方法。
它返回一个FileAttributes枚举值,可以使用按位 AND 进行测试,以查找 Directory 位是否已设置并且是最快的方法(除了直接的非托管调用)。

try
{
    // get the file attributes for file or directory 
    FileAttributes attr = File.GetAttributes(sPath);
    bool isDir = ((attr & FileAttributes.Directory) == FileAttributes.Directory) ? true : false;
    if (isDir == false)
       ....
    else
       ....
    }
}
catch(Exception ex)
{
    // here as an example. probably you should handle this in the calling code
    MessageBox.Show("GetAttributes", ex.Message);
}

当然,如果路径所代表的文件或目录不存在,则会出现应处理的异常。

作为旁注: Directory.Exists 或 File.Exists 可以告诉您是否存在具有指定名称的文件或目录,但是如果您不知道路径字符串代表什么,如何调用正确的名称?你需要打电话来确定。

于 2012-10-06T12:20:44.323 回答
1

There is no way to get more information about a file unless you physically read it. From what I understand, you want to avoid reading the file.

You have no other option but to verify extensions and trailing slashes contained in the string. But even like that, the result will never be real. For example, I just created this folder in my d:

D:\Music\file.txt

and I created this file inside:

D:\Music\file.txt\folder
于 2012-10-06T12:31:33.630 回答