In C# .NET, Come copiare un file in un'altra posizione, sovrascrivendo il file esistente se il file di origine è più recente del file esistente (avere una "Data modificata" successiva) e facendo notazione se il file sorgente è più vecchio?Copia file, sovrascrivi se più recente
risposta
È possibile utilizzare la FileInfo
class ed è proprietà e metodi:
FileInfo file = new FileInfo(path);
string destDir = @"C:\SomeDirectory";
FileInfo destFile = new FileInfo(Path.Combine(destDir, file.Name));
if (destFile.Exists)
{
if (file.LastWriteTime > destFile.LastWriteTime)
{
// now you can safely overwrite it
file.CopyTo(destFile.FullName, true);
}
}
È possibile utilizzare la classe FileInfo:
FileInfo infoOld = new FileInfo("C:\\old.txt");
FileInfo infoNew = new FileInfo("C:\\new.txt");
if (infoNew.LastWriteTime > infoOld.LastWriteTime)
{
File.Copy(source path,destination path, true) ;
}
In un file batch, questo funzionerà:
XCopy "c:\my directory\source.ext" "c:\my other directory\dest.ext" /d
sì .. ma probabilmente più complicato dal momento che dobbiamo occuparci degli spazi nel percorso, ecc. –
Abbastanza corretto, penso che i file batch consentano di inserire virgolette singole o doppie attorno a un percorso di file se questo aiuta – JMK
Ecco la mia risposta alla risposta: le copie non spostano il contenuto delle cartelle. Se il bersaglio non esiste il codice è più chiaro da leggere. Tecnicamente, la creazione di un fileinfo per un file inesistente avrà un LastWriteTime di DateTime.Min in modo che sia nella copia ma ne diminuisca brevemente la leggibilità. Spero che questo codice testato aiuti qualcuno.
** EDIT: Ho aggiornato la mia fonte per essere molto più flessibile. Poiché si basava su questo thread, ho pubblicato l'aggiornamento qui. Quando si utilizzano maschere i sottodirectory non vengono creati se la sottocartella non contiene file corrispondenti. Sicuramente un gestore di errori più robusto è nel tuo futuro. :)
public void CopyFolderContents(string sourceFolder, string destinationFolder)
{
CopyFolderContents(sourceFolder, destinationFolder, "*.*", false, false);
}
public void CopyFolderContents(string sourceFolder, string destinationFolder, string mask)
{
CopyFolderContents(sourceFolder, destinationFolder, mask, false, false);
}
public void CopyFolderContents(string sourceFolder, string destinationFolder, string mask, Boolean createFolders, Boolean recurseFolders)
{
try
{
if (!sourceFolder.EndsWith(@"\")){ sourceFolder += @"\"; }
if (!destinationFolder.EndsWith(@"\")){ destinationFolder += @"\"; }
var exDir = sourceFolder;
var dir = new DirectoryInfo(exDir);
SearchOption so = (recurseFolders ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
foreach (string sourceFile in Directory.GetFiles(dir.ToString(), mask, so))
{
FileInfo srcFile = new FileInfo(sourceFile);
string srcFileName = srcFile.Name;
// Create a destination that matches the source structure
FileInfo destFile = new FileInfo(destinationFolder + srcFile.FullName.Replace(sourceFolder, ""));
if (!Directory.Exists(destFile.DirectoryName) && createFolders)
{
Directory.CreateDirectory(destFile.DirectoryName);
}
if (srcFile.LastWriteTime > destFile.LastWriteTime || !destFile.Exists)
{
File.Copy(srcFile.FullName, destFile.FullName, true);
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + Environment.NewLine + Environment.NewLine + ex.StackTrace);
}
}
Avviso questo non è un ricorsivo chiamata. (Questo deve essere wikified) –
Questo funziona davvero bene. Suggerirei un ulteriore miglioramento. Aggiungere un test di checksum se il file esiste sia nell'origine che in dest in modo da non copiare il file se sono identici. public String GetChecksum (String filePath) { \t utilizzando (var flusso = new BufferedStream (File.OpenRead (filePath), 1200000)) \t { \t \t SHA256Managed sha = new SHA256Managed(); \t \t byte [] checksum = sha.ComputeHash (flusso); \t \t return BitConverter.ToString (checksum) .Replace ("-", String.Empty); \t} } –
@ChristopherHaws, è un'ottima idea. Lo ripiegherò quando avrò un minuto. :) –
- 1. Rischi passaggio da 'Copia sempre' a 'Copia se più recente'
- 2. Coda il file più recente
- 3. Sovrascrivi un file in Node.js
- 4. Come trovare l'istantanea AWS RDS più recente o più recente?
- 5. Controlla se il file è più recente di un altro file?
- 6. Windows: Sovrascrivi file in uso
- 7. Ricevi il mercoledì più recente?
- 8. Posso reindirizzare al file più recente nella directory usando .htaccess?
- 9. Comando personalizzato CMake copia più file
- 10. più recente valore max/min
- 11. Verificare se esiste una versione più recente del mio file locale in Github, con R
- 12. Server Imap più recente Libreria
- 13. Ottieni il file più recente basato sul timestamp
- 14. Collegamento simbolico al file più recente in una cartella
- 15. Sovrascrivi il file sul server (PHP)
- 16. Aggiornamento Git alla versione più recente (mac)
- 17. Controllare se la data è più vecchia di 10 anni e più recente di 20 anni
- 18. In Gulp, come faccio a eseguire un'attività su un solo file se uno dei file multipli è più recente?
- 19. Utilizzare git per ottenere solo la revisione più recente
- 20. Come aggiornare Spark alla versione più recente?
- 21. Aggiornamento Spotify più recente: Script Autohotkeys rotto
- 22. Sovrascrivi auto_now per unittest
- 23. Trova post più vecchio/più recente nella collezione mongodb
- 24. php mysql ordina per data (più recente)
- 25. come utilizzare kapt in androidScopo più recente
- 26. MySQL: recupera il record più recente
- 27. MySQL UNISCITI solo alla riga più recente?
- 28. NPM aggiornamento tutto alla versione più recente
- 29. Recupera l'entità più recente da Datomic
- 30. Esiste un'alternativa più recente ad AvalonDock?
è questa finestra o approccio web ?? – user1102001
@ user1102001 windows –
Si potrebbe trovare questo più semplice con un file batch, penso che il comando xcopy rende questo semplice – JMK