2010-07-29 11 views
38

पर सी # में फ़ाइल को अंतिम बार संशोधित किया गया था, यह जांच कर रहा हूं कि जब मैं फ़ाइल को अंतिम बार C# में संशोधित करता था तो यह देखने का एक तरीका ढूंढ रहा हूं। मेरे पास फ़ाइल तक पूर्ण पहुंच है।विंडोज ओएस

+0

संभव डुप्लिकेट [ग # में फ़ाइल से संशोधित करने के लिए कैसे तिथि] (http://stackoverflow.com/questions/1185378/how-to-get -मोडाइफाइड-डेट-इन-फाइल-इन-सी-तेज) – 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

के लिए उपरोक्त कोड उदाहरण शामिल करने के लिए समय लेना। – PhilNicholas

14

पता है कि समारोह File.GetLastWriteTime हमेशा की तरह उम्मीद है, कभी-कभी मूल्य तत्क्षण ओएस द्वारा अद्यतन नहीं कर रहे हैं काम नहीं करता है। आपको पुरानी टाइमस्टैम्प मिल सकती है, भले ही फ़ाइल को पहले संशोधित किया गया हो।

व्यवहार ओएस संस्करणों के बीच भिन्न हो सकता है। उदाहरण के लिए, यह यूनिट परीक्षण मेरी डेवलपर मशीन पर हर बार अच्छी तरह से काम करता है, लेकिन यह हमेशा हमारे बिल्ड सर्वर पर विफल रहता है।

[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

आपके विकल्प देखें:

क) कभी-कभी चूक के साथ रहते हैं।

बी) पर्यवेक्षक पैटर्न (उदाहरण के लिए एक टीसीपी सर्वर क्लाइंट संरचना) को महसूस करने वाला सक्रिय घटक बनाएं, फ़ाइलों को लिखने/पढ़ने के बजाय सीधे परिवर्तनों को संचारित करें। तेज़ और लचीला, लेकिन एक और निर्भरता और असफलता का एक संभावित बिंदु (और निश्चित रूप से कुछ काम)।

सी) एक समर्पित सिग्नल फ़ाइल की सामग्री को प्रतिस्थापित करके सिग्नलिंग प्रक्रिया सुनिश्चित करें कि अन्य प्रक्रिया नियमित रूप से पढ़ी जाती है। यह स्मार्ट नहीं है क्योंकि यह एक मतदान प्रक्रिया है और फ़ाइल.गेटलास्टवाइटटाइम को कॉल करने से अधिक ओवरहेड है, लेकिन यदि बहुत से स्थानों से सामग्री की जांच नहीं की जाती है, तो यह काम करेगा।

/// <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()); 
    } 
की
संबंधित मुद्दे