在我的新代码中,我不使用字符串传递目录路径或文件名。相反,我使用DirectoryInfo和FileInfo,因为它们似乎封装了大量信息。
我已经看到很多代码使用字符串传递目录信息,然后在长难以理解的语句中“分裂”,“中”和“instr”,直到它们获得他们正在查找的目录的一部分。
将路径作为字符串传递是否有充分的理由?
答案 0 :(得分:11)
一般来说,我认为将信息保存在FileInfo / DirectoryInfo中会更好。这些类中有许多有用的功能,并且涉及很多安全性,因为检查文件的存在,查看最初指定的文件等要容易得多。
我将(可能)传递路径的唯一地方,如字符串而不是使用FileInfo和DirectoryInfo,如果路径将通过AppDomain或进程之间传递等。
FileInfo和DirectoryInfo在AppDomain边界上都可以正常工作(因为它们是Serializable),但是在这种情况下它们有更多的开销。如果事情反复发生,可能会产生影响。
在这种情况下,我会坚持使用FileInfo和DirectoryInfo,除非我发现在我的分析过程中存在明显的问题,并且我试图减少序列化数据的数量。如果我没有遇到性能问题,我会坚持使用这些类,因为它们提供了很多安全性和功能。
答案 1 :(得分:5)
一旦路径在应用程序中(即不在纯文本配置文件中),不,没有充分的理由。
唯一一次(我能想到)可能有用的是与只接受路径作为字符串的代码进行互操作。
答案 2 :(得分:5)
Path.GetFileName
Path.GetDirectoryName
Path.Combine
等...
这些来自System.IO.Path类,顺便说一句。
答案 3 :(得分:0)
我在将FileInfo传递给DMZ时遇到了问题。据我所见 - 纠正我,如果我错了 - FileInfo在反序列化时执行权限检查,这将无法从DMZ工作,导致'找不到路径'。使用您代替的数据创建并传递自定义对象。
答案 4 :(得分:0)
我认为你需要一个类来封装文件或目录路径,而不是使用原始字符串并使用静态System.IO.Path类来操作它们。但是,I don't find DirectoryInfo and FileInfo suitable,因为它们似乎更多地用于执行文件/目录操作而不是路径操作。如果您为路径操作创建自定义类,则可以提供more user friendly path manipulation functionality。
答案 5 :(得分:0)
要记住路径字符串和FileInfo之间的一个重要区别,可以在以下测试中进行总结:
FileInfo反映了有关实例化时文件的信息-可以删除/修改它,而FileInfo不会反映该信息。
[TestMethod]
public void TestFileInfo()
{
var path = @"C:\Users\bjarmuz\Desktop\aybabtu.txt";
File.WriteAllText(path, "All your base are belong to us!");
var file = new FileInfo(path);
Assert.IsTrue(file.Exists);
File.Delete(file.FullName);
Assert.IsTrue(file.Exists);
Assert.IsFalse(File.Exists(file.FullName));
}
[TestMethod]
public void TestFileInfo()
{
var path = @"C:\Users\bjarmuz\Desktop\aybabtu.txt";
File.WriteAllText(path, "All your base are belong to us!");
Thread.Sleep(1000);
var file = new FileInfo(path);
var date = DateTime.UtcNow;
Assert.IsTrue(file.LastWriteTimeUtc< date);
File.WriteAllText(path, "No!");
Assert.IsTrue(File.GetLastWriteTimeUtc(file.FullName)> date);
Assert.IsFalse(file.LastWriteTimeUtc > date);
}
这可能会引起误解,并且如果代码通过FileInfos而不是字符串传递,则对于Exists
或Last[..]Time
之类的属性,您可能会看到错误的结果-如果您这样做,则不会发生使用File.Get[...]()
方法。
但是,另一方面,您也不应该依赖File.Exists()方法-因为可以在运行测试后立即创建/删除文件。正确的方法是不要执行此检查,而是接受它会引发IO异常(并准备妥善处理它)。这篇出色的文章https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/
中的更多信息此外,FileInfo / DirectoryInfo的一个重要“优势”是它可以保护您的方法(和方法使用者)免受此损害:
void SaveEntity(Entity theThing, string path)
{
//now, based on the signature, you don't know whether you need file path or directory path
}
//void SaveEntity(Entity theThing, DirectoryInfo path) {}
//void SaveEntity(Entity theThing, FileInfo path) {}