我知道过去曾问过几个类似的问题我也知道我可以使用Directory.Exists()
或File.Exists()
或使用API调用来检查文件系统,但我只是想做出这个决定基于输入字符串。
public bool ValidateOutputFilename ( string sPath )
{
// check if sPath is actually a filename
}
我的猜测是,这是不可能的,因为看起来像文件夹名称(没有扩展名但没有尾随\
)的东西实际上可能是文件(例如C:\A\B\C
可能代表文件或文件夹反之亦然。)
我想避免文件系统检查的原因是因为路径可能存在/可能不存在,sPath
可能代表网络位置,在这种情况下文件系统查询会很慢。
我希望有人能推荐一个我尚未考虑的想法。
答案 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