FileInfo.Exists复制文件后返回False

时间:2017-02-10 16:15:46

标签: c#-4.0

在下面的代码中,test.txt在运行之前就存在了,而test2.txt却没有。在将文件复制到destFile的位置后,运行destFile.Exists时返回null。是什么造成的?我在msdn中找不到支持正在发生的事情的任何信息。

    var origFile = new FileInfo(@"C:\Users\user\Desktop\CopyTest\test.txt");
    var destFile = new FileInfo(@"C:\Users\user\Desktop\CopyTest\test2.txt");

    if (!destFile.Exists && origFile.Exists)
        origFile.CopyTo(destFile.FullName);

    if (destFile.Exists)
        Console.WriteLine("The file was found");

    Console.ReadLine();

1 个答案:

答案 0 :(得分:7)

在访问媒体资源

之前尝试使用destFile.Refresh();
destFile.Refresh();
if (destFile.Exists)
        Console.WriteLine("The file was found");

或使用静态方法File.Exists

if (File.Exists(@"C:\Users\user\Desktop\CopyTest\test2.txt"))
    Console.WriteLine("The file was found");

FileInfo提供了大量信息,但这是一个快照,它将在您第一次访问时初始化,以后不会更新。因此,只有在需要当前状态且需要多个信息时才使用它。否则使用static methods in System.IO.File

Here您可以看到Exists属性的当前实现。您在第一次访问它时看到它正在初始化它,稍后将返回旧状态:

public override bool Exists {
[System.Security.SecuritySafeCritical]  // auto-generated
get {
    try {
        if (_dataInitialised == -1)
            Refresh();
        if (_dataInitialised != 0) {
            // Refresh was unable to initialise the data.
            // We should normally be throwing an exception here, 
            // but Exists is supposed to return true or false.
            return false;
        }
        return (_data.fileAttributes & Win32Native.FILE_ATTRIBUTE_DIRECTORY) == 0;
    }
    catch
    {
        return false;
    }
}