将路径作为字符串传递而不是使用DirectoryInfo / FileInfo的充分理由

时间:2009-03-20 18:11:00

标签: .net string directory

在我的新代码中,我使用字符串传递目录路径或文件名。相反,我使用DirectoryInfo和FileInfo,因为它们似乎封装了大量信息。

我已经看到很多代码使用字符串传递目录信息,然后在长难以理解的语句中“分裂”,“中”和“instr”,直到它们获得他们正在查找的目录的一部分。

将路径作为字符串传递是否有充分的理由?

6 个答案:

答案 0 :(得分:11)

一般来说,我认为将信息保存在FileInfo / DirectoryInfo中会更好。这些类中有许多有用的功能,并且涉及很多安全性,因为检查文件的存在,查看最初指定的文件等要容易得多。

我将(可能)传递路径的唯一地方,如字符串而不是使用FileInfo和DirectoryInfo,如果路径将通过AppDomain或进程之间传递等。

FileInfo和DirectoryInfo在AppDomain边界上都可以正常工作(因为它们是Serializable),但是在这种情况下它们有更多的开销。如果事情反复发生,可能会产生影响。

在这种情况下,我会坚持使用FileInfo和DirectoryInfo,除非我发现在我的分析过程中存在明显的问题,并且我试图减少序列化数据的数量。如果我没有遇到性能问题,我会坚持使用这些类,因为它们提供了很多安全性和功能。

答案 1 :(得分:5)

一旦路径在应用程序中(即不在纯文本配置文件中),不,没有充分的理由。

唯一一次(我能想到)可能有用的是与只接受路径作为字符串的代码进行互操作。

答案 2 :(得分:5)

如果你需要的只是路径,那么DirectoryInfo和FileInfo非常重要。我会更关注“分裂,中间和内部”的垃圾。了解方法:

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而不是字符串传递,则对于ExistsLast[..]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) {}