可以判断路径是否代表C#/ .NET 2.0中的文件或文件夹名称?

时间:2012-10-06 12:16:22

标签: c# .net-2.0 filenames

我知道过去曾问过几个类似的问题我也知道我可以使用Directory.Exists()File.Exists()或使用API​​调用来检查文件系统,但我只是想做出这个决定基于输入字符串。

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

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

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

我希望有人能推荐一个我尚未考虑的想法。

2 个答案:

答案 0 :(得分:2)

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

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

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可以告诉您文件或目录是否存在具有指定名称,但如果您不知道路径字符串代表什么,如何调用正确的文件或目录?你需要打电话才能确定。

答案 1 :(得分:1)

除非您实际阅读,否则无法获取有关文件的更多信息。据我所知,你想避免阅读文件。

您没有其他选择,只能验证字符串中包含的扩展名和尾部斜杠。但即使这样,结果也永远不会真实。例如,我刚刚在我的d:

中创建了这个文件夹
D:\Music\file.txt

我在里面创建了这个文件:

D:\Music\file.txt\folder