2013-08-20 14 views
10

ho bisogno di ottenere quando un file è stato creato - Ho provato con:File data di creazione in C#

FileInfo fi = new FileInfo(FilePath); 
var creationTime = fi.CreationTimeUtc; 

e

var creationTime = File.GetCreationTimeUtc(FilePath); 

Entrambi i metodi generalmente tornare l'ora di creazione sbagliato - Credo che è stato memorizzato nella cache da qualche parte.

Il file viene eliminato e ricreato con lo stesso nome e ho bisogno di sapere quando/se è stato ricreato (controllando se la data/ora è stata modificata) - Avevo programmato di farlo vedendolo il tempo di creazione del file era cambiato ma ho trovato che questo fosse impreciso.

Sto lavorando su Win 7 e se controllo File Explorer mostra correttamente il nuovo orario di creazione del file.

Ho anche provato a utilizzare FileSystemWatcher ma non funziona completamente per il mio caso d'uso. Per esempio. se il mio programma non è in esecuzione, FileSystemWatcher non è in esecuzione, quindi quando il mio programma si riavvia non so se il file è stato cancellato e ricreato o meno.

Ho visto MSDN http://msdn.microsoft.com/en-us/library/system.io.file.getcreationtime.aspx in cui si dice:

Questo metodo può restituire un valore inesatto, in quanto utilizza le funzioni native i cui valori non possono essere continuamente aggiornato dal sistema operativo.

Ma ho anche provato a utilizzare il loro suggerimento alternativo e impostare SetCreationDate dopo aver creato un nuovo file, ma ho trovato anche che questo non funziona. Vedi prova di seguito:

[Test] 
    public void FileDateTimeCreatedTest() 
    { 
     var binPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); 
     var fullFilePath = Path.Combine(binPath, "Resources", "FileCreatedDatetimeTest.txt"); 
     var fullFilePathUri = new Uri(fullFilePath); 


     var dateFormatted = "2013-08-17T15:31:29.0000000Z"; // this is a UTC string 
     DateTime expectedResult = DateTime.MinValue; 
     if (DateTime.TryParseExact(dateFormatted, "o", CultureInfo.InvariantCulture, 
      DateTimeStyles.AssumeUniversal, out expectedResult)) // we expect the saved datetime to be in UTC. 
     { 

     } 

     File.Create(fullFilePathUri.LocalPath); 
     Thread.Sleep(1000); // give the file creation a chance to release any lock 

     File.SetCreationTimeUtc(fullFilePathUri.LocalPath, expectedResult); // physically check what time this puts on the file. It should get the local time 16:31:29 local 
     Thread.Sleep(2000); 
     var actualUtcTimeFromFile = File.GetCreationTimeUtc(fullFilePathUri.LocalPath); 

     Assert.AreEqual(expectedResult.ToUniversalTime(), actualUtcTimeFromFile.ToUniversalTime()); 

     // clean up 
     if (File.Exists(fullFilePathUri.LocalPath)) 
      File.Delete(fullFilePathUri.LocalPath); 
    } 

Qualsiasi aiuto molto apprezzato.

+7

Hai provato a utilizzare 'FileInfo.Refresh'? –

+0

Questo ha fatto il trucco - grazie! – Will

risposta

8

È necessario utilizzare Refresh:

FileSystemInfo.Refresh prende un'istantanea del file dalla corrente Sistema file . L'aggiornamento non può correggere il file system sottostante anche se il file system restituisce informazioni errate o non aggiornate. Questo può si verifica su piattaforme come Windows 98.

Le chiamate devono essere effettuate per aggiornare prima di tentare di ottenere l'attributo informazioni, o le informazioni saranno obsolete.

I bit della chiave di MSDN indicano che prende un'istantanea e attributo information..will essere superato.

3

Provare a utilizzare FileInfo e Refresh metodo di esso

fileInfo.Refresh(); 
var created = fileInfo.CreationTime; 

questo dovrebbe funzionare

0
File.Create(fullFilePathUri.LocalPath); 
Thread.Sleep(1000); // give the file creation a chance to release any lock 

Non è così che si fa. File.Create crea lo stream writer che dovrebbe essere chiuso per rilasciare il lock senza alcuna attesa. Se ti trovi usando Thread.Dormi, troverai spesso che stai facendo qualcosa di sbagliato.

Problemi correlati