Следует иметь в виду одно существенное различие между строкой пути и 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 () - поскольку файл можно создать / удалить сразу после запуска тестов. Правильный способ для этого - НЕ делать эту проверку, а скорее принять, что он может вызвать исключение ввода-вывода (и быть готовым обработать это правильно). Подробнее в этой замечательной статье 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) {}