2017-11-08 13 views
1

ファイルを移動していますが、FileInfo.Existsが実際には動作しないことに気付きました。以下の例では、ファイルを "foo"から "bar"に移動した後、FileInfoオブジェクトはどちらもExistと思われます。他の試合では、私は両方の存在が間違っているのを見ました。FileInfo.MoveToはFileInfo.Existsを更新しません

using System.IO;//File, FileInfo 

     public static void TestMoveTo() 
     { 
      // create file 1 
      string FileName = @"d:\temp\foo.txt"; 
      File.WriteAllText(FileName, "Test file\n"); 
      FileInfo FI_Test = new FileInfo(FileName); 
      // move to file 2 
      string NewFileName = @"d:\temp\bar.txt"; 
      if (File.Exists(NewFileName)) 
       File.Delete(NewFileName); 
      FileInfo FI_New = new FileInfo(NewFileName); 
      FI_Test.MoveTo(FI_New.FullName); 
      // test 
      bool OldExists = FI_Test.Exists; 
      bool NewExists = FI_New.Exists; 
      // use File.Exists 
      bool OldExists2 = File.Exists(FileName); 
      bool NewExists2 = File.Exists(NewFileName); 
      return;//debug breakpoint 
     } 

flushへの道は、ファイルシステムあり、またはupdateのFileInfoオブジェクト?

File.Existsメソッドを使用すると、移動後にファイルシステムを調べるので、不思議ではありません。

これは、ファイルシステムを変更した後に、関連するFileInfoオブジェクトが単純に無効であることを意味しますか?

+1

[documentation](https://msdn.microsoft.com/en-us/library/system.io.fileinfo.exists%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)を参照してください。 :_最初に呼び出されたとき、FileInfoはRefreshを呼び出し、ファイルに関する情報をキャッシュします。その後の呼び出しでは、情報の最新コピーを取得するために更新を呼び出す必要があります._ – Default

+0

@Default Great!どういうわけか私はその電話を見つけられませんでした。あなたが最初だったように、私があなたの答えを選ぶなら、あなたの答えを選ぶでしょう。 – Roland

+0

ありがとうございますが、それは大丈夫です。与えられた答えは私が作ったよりも詳細です:) – Default

答えて

2

FileInfo.Existsはインスタンスプロパティです。あなたのFileInfoが発症したときに作成されます。すなわち、FileInfo FI_New = new FileInfo(NewFileName)に電話をしたとき。 NewFileNameが存在せず、後で作成する場合、FI.Existsは変更されません。それについて考える。お電話の場合:

var noSuchFile = @"c:\this file does not exist"; 
File.Delete(noSuchFile); // just to be sure... 
var fileExists = File.Exists(); 
var fi = new FileInfo(noSuchFile); 
File.Create(noSuchFile); 

あなたはそのコードの末尾にFalseTrueからfileExists変更をと思いますか? fi.Existsは変更されますか?彼らはしません。

FileInfo.Refresh()は、Existsを含むインスタンスのプロパティを更新する方法です。またはnew FileInfo()に再度電話することもできます。

+0

ありがとうございます。プロパティ*はFile.Exists()メソッドを呼び出すことができますが、明らかにこのメソッドは呼び出されません。 – Roland

+0

でも、 'Refresh'を呼び出さなくても、' bool NewExists = FI_New.Exists'がどのようにTrueになるのでしょうか? – Roland

関連する問題