2010-07-29 5 views
38

파일이 C#에서 마지막으로 수정 된 시간을 확인하는 방법을 찾고 있습니다. 파일에 대한 전체 액세스 권한이 있습니다.Windows OS에서 C#으로 파일을 마지막으로 수정 한 시간을 확인하십시오.

+0

가능한 중복 [C#에서 파일의 날짜를 수정하는 방법에] (http://stackoverflow.com/questions/1185378/how-to-get -c-sharp-file-in-c-sharp) – nawfal

+0

위 링크의 문제는보다 구체적인 경우이지만 동의합니다. 여기에 허용 된 대답이 해당 질문에 언급되어 있습니다. – Candyfloss

답변

74

System.IO.File.GetLastWriteTime이 필요합니다.

+0

또는 심지어 가능합니다 [System.IO.File.GetLastWriteTimeUtc] (https://msdn.microsoft.com/en-us/library/system.io.file.getlastwritetimeutc (v = vs.110) .aspx) –

5

그냥 File.GetLastWriteTime을 사용하십시오. 이 페이지에는 사용 방법을 보여주는 샘플이 있습니다.

48

정적 메서드 인 File.GetLastWriteTime 만 있으면됩니다.

예 :

DateTime lastModified = System.IO.File.GetLastWriteTime("C:\foo.bar"); 

Console.WriteLine(lastModified.ToString("dd/MM/yy HH:mm:ss")); 
+0

Upvote for 코드 예제를 포함하여 시간을 보냅니다. – PhilNicholas

14

것은, 값이 때로는 즉시 OS가 업데이트되지 않습니다 예상대로 함수가 File.GetLastWriteTime 항상 작동하지 않습니다 유의하십시오. 파일이 바로 전에 수정 된 경우에도 이전 타임 스탬프를 얻을 수 있습니다.

OS마다 동작이 다를 수 있습니다. 예를 들어,이 단위 테스트는 개발자 머신에서 매번 잘 수행되었지만 빌드 서버에서는 항상 실패합니다.

[TestMethod] 
    public void TestLastModifiedTimeStamps() 
    { 
    var tempFile = Path.GetTempFileName(); 
    var lastModified = File.GetLastWriteTime(tempFile); 
    using (new FileStream(tempFile, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 

    } 
    Assert.AreNotEqual(lastModified, File.GetLastWriteTime(tempFile)); 
    } 

File.GetLastWriteTime seems to be returning 'out of date' value

옵션을 참조하십시오

가) 가끔 누락과 함께 살고 있습니다.

b) 관측자 패턴 (예 : tcp 서버 클라이언트 구조)을 구현하는 활성 구성 요소를 작성하고 파일을 쓰거나 읽는 대신 변경 사항을 직접 전달합니다. 빠르고 유연하지만 다른 종속성과 가능한 실패 지점 (물론 일부 작업).

c) 다른 프로세스가 정기적으로 읽는 전용 신호 파일의 내용을 대체하여 신호 프로세스를 보장합니다. 그것은 폴링 프로 시저 인만큼 똑똑하지 않고 File.GetLastWriteTime을 호출하는 것보다 더 많은 오버 헤드가 있습니다. 너무 자주 너무 많은 곳에서 내용을 확인하지 않으면 작업을 수행합니다. 그것을 위해

/// <summary> 
/// type to set signals or check for them using a central file 
/// </summary> 
public class FileSignal 
{ 
    /// <summary> 
    /// path to the central file for signal control 
    /// </summary> 
    public string FilePath { get; private set; } 

    /// <summary> 
    /// numbers of retries when not able to retrieve (exclusive) file access 
    /// </summary> 
    public int MaxCollisions { get; private set; } 

    /// <summary> 
    /// timespan to wait until next try 
    /// </summary> 
    public TimeSpan SleepOnCollisionInterval { get; private set; } 

    /// <summary> 
    /// Timestamp of the last signal 
    /// </summary> 
    public DateTime LastSignal { get; private set; } 

    /// <summary> 
    /// constructor 
    /// </summary> 
    /// <param name="filePath">path to the central file for signal control</param> 
    /// <param name="maxCollisions">numbers of retries when not able to retrieve (exclusive) file access</param> 
    /// <param name="sleepOnCollisionInterval">timespan to wait until next try </param> 
    public FileSignal(string filePath, int maxCollisions, TimeSpan sleepOnCollisionInterval) 
    { 
     FilePath = filePath; 
     MaxCollisions = maxCollisions; 
     SleepOnCollisionInterval = sleepOnCollisionInterval; 
     LastSignal = GetSignalTimeStamp(); 
    } 

    /// <summary> 
    /// constructor using a default value of 50 ms for sleepOnCollisionInterval 
    /// </summary> 
    /// <param name="filePath">path to the central file for signal control</param> 
    /// <param name="maxCollisions">numbers of retries when not able to retrieve (exclusive) file access</param>   
    public FileSignal(string filePath, int maxCollisions): this (filePath, maxCollisions, TimeSpan.FromMilliseconds(50)) 
    { 
    } 

    /// <summary> 
    /// constructor using a default value of 50 ms for sleepOnCollisionInterval and a default value of 10 for maxCollisions 
    /// </summary> 
    /// <param name="filePath">path to the central file for signal control</param>   
    public FileSignal(string filePath) : this(filePath, 10) 
    { 
    } 

    private Stream GetFileStream(FileAccess fileAccess) 
    { 
     var i = 0; 
     while (true) 
     { 
      try 
      { 
       return new FileStream(FilePath, FileMode.Create, fileAccess, FileShare.None); 
      } 
      catch (Exception e) 
      { 
       i++; 
       if (i >= MaxCollisions) 
       { 
        throw e; 
       } 
       Thread.Sleep(SleepOnCollisionInterval); 
      }; 
     }; 
    } 

    private DateTime GetSignalTimeStamp() 
    { 
     if (!File.Exists(FilePath)) 
     { 
      return DateTime.MinValue; 
     } 
     using (var stream = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.None)) 
     { 
      if(stream.Length == 0) 
      { 
       return DateTime.MinValue; 
      } 
      using (var reader = new BinaryReader(stream)) 
      { 
       return DateTime.FromBinary(reader.ReadInt64()); 
      };     
     } 
    } 

    /// <summary> 
    /// overwrites the existing central file and writes the current time into it. 
    /// </summary> 
    public void Signal() 
    { 
     LastSignal = DateTime.Now; 
     using (var stream = new FileStream(FilePath, FileMode.Create, FileAccess.Write, FileShare.None)) 
     { 
      using (var writer = new BinaryWriter(stream)) 
      { 
       writer.Write(LastSignal.ToBinary()); 
      } 
     } 
    } 

    /// <summary> 
    /// returns true if the file signal has changed, otherwise false. 
    /// </summary>   
    public bool CheckIfSignalled() 
    { 
     var signal = GetSignalTimeStamp(); 
     var signalTimestampChanged = LastSignal != signal; 
     LastSignal = signal; 
     return signalTimestampChanged; 
    } 
} 

일부 테스트 :

[TestMethod] 
    public void TestSignal() 
    { 
     var fileSignal = new FileSignal(Path.GetTempFileName()); 
     var fileSignal2 = new FileSignal(fileSignal.FilePath); 
     Assert.IsFalse(fileSignal.CheckIfSignalled()); 
     Assert.IsFalse(fileSignal2.CheckIfSignalled()); 
     Assert.AreEqual(fileSignal.LastSignal, fileSignal2.LastSignal); 
     fileSignal.Signal(); 
     Assert.IsFalse(fileSignal.CheckIfSignalled()); 
     Assert.AreNotEqual(fileSignal.LastSignal, fileSignal2.LastSignal); 
     Assert.IsTrue(fileSignal2.CheckIfSignalled()); 
     Assert.AreEqual(fileSignal.LastSignal, fileSignal2.LastSignal); 
     Assert.IsFalse(fileSignal2.CheckIfSignalled()); 
    } 
관련 문제