2009-10-08 11 views
6

Ho creato un programma di screenshot e tutto funziona alla grande. L'unico problema è che non sono sicuro di come posso far sì che gli screenshot vengano salvati con i numeri in allegato.C# - Aggiungi numero al file che si sta salvando

Esempio: Schermata 1, Schermata 2, Schermata 3, Schermata 4, ecc

Ovviamente questo potrebbe essere applicata ad altri file salvati. Qualche idea? Grazie.

+0

Forse potresti mostrarci il codice che hai scritto finora ... –

risposta

10

Ecco un metodo che uso frequentemente per questo stesso caso. Basta passare una stringa come "Schermata" e sarà il più basso nome di file disponibili nel formato di "Schermata [numero]" (o semplicemente "Schermata", se non ci sono già):

private string GetUniqueName(string name, string folderPath) 
{ 
    string validatedName = name; 
    int tries = 1; 
    while (File.Exists(folderPath + validatedName)) 
    { 
     validatedName = string.Format("{0} [{1}]", name, tries++); 
    } 
    return validatedName; 
} 

(Nota: questa è una versione leggermente semplificata che non tiene conto delle estensioni di file).

+1

Grazie! Questo è esattamente ciò di cui ho bisogno. Perfetto come controlla il nome file più basso disponibile, pensato per metterlo nella domanda. Grazie mille signore. – user

+2

Vorrei usare 'Path.Combine (folderPath, validatedName)' al posto di 'folderPath + validatedName'. –

+0

Sarah ha ragione. Senza Path.Combine (folderPath, validatedName) non funzionerà mai in quanto richiederebbe il nome della cartella come parte del nome del file. Ho inserito il blocco di codice corretto sotto proposto inizialmente da Rex M. – Rahatur

0

Dato che si stanno scrivendo i file, un approccio consiste nel cercare la directory di salvataggio corrente e trovare il file più recente chiamato ScreenshotXX, e utilizzare una regex per ottenere il numero dal nome.

È possibile utilizzare la classe DirectoryInfo insieme alla classe Regex per questo.

+0

Questo potrebbe facilmente rompersi. Cosa succede se l'utente crea un file che ha il nome di uno dei file di screenshot? Cosa succede se l'utente modifica un vecchio file screenshot?La soluzione deve verificare l'esistenza di ogni file fino a quando non trova un "gap". – jnylen

+0

@jnylen: Cosa succede se l'utente crea un file con il nome di uno dei file di screenshot? >> Non è possibile avere due file con nomi identici. Cosa succede se l'utente modifica un vecchio file screenshot? >> La modifica di un file non ha importanza, in quanto non modifica la data di creazione. La soluzione deve verificare l'esistenza di ciascun file fino a quando non trova un "gap". >> Abbastanza vero. Tuttavia se non può scrivere il file (perché esiste), dovrebbe aumentare il numero fino a quando non può scrivere. Non penso che cercare un gap sia una buona idea, perché se hai SS1, SS3, SS4, lo screenshot più recente sarà SS2? – Alan

0

sintesi della soluzione

  1. Directory.GetFiles (dest);
  2. ordinare i file nomi
  3. analizzare ultimo nome file, trovare l'ultimo numero utilizzato
  4. scrittura file successivo con il numero successivo allegati.

sarebbe questo lavoro per voi?

3

C'è un motivo per cui stai usando i numeri? La stessa cartella verrà riutilizzata in seguito per un'altra sessione? I numeri dovrebbero riavviare e sostituire i file esistenti se il giorno è diverso?

Questi sono i tipi di cose da tenere a mente. Vale la pena notare che OS X era solito fornire "Picture 1", "Picture 2" quando faceva screenshot, e per fortuna nella nuova versione ora usa "Screenshot catturato nel 2009-12-08 alle 11.35.12" o qualcosa di simile, permettendo ordinamento più semplice per data, evitando facilmente conflitti di denominazione ecc.

Come postato in altri suggerimenti, è ancora necessario verificare se il file esiste già e quando si riprova DateTime.Ora sarà diverso, quindi il nome file sarà diverso. Ovviamente non si dovrebbero ottenere conflitti a meno che gli screenshot non siano nello stesso millisecondo o l'utente non stia scherzando con la data/ora (o l'ora legale può rovinare anche te).

+1

Attualmente, i file vengono salvati utilizzando un timestamp. Ma alcune persone mi hanno chiesto se potevo includere un'opzione che aggiunge un numero alla fine del nome del file se è così che scelgono il file da salvare. Apprezzo il tuo suggerimento. – user

+0

In questo caso hai due opzioni, o loop usando File.Exists controlla con ogni numero successivo (veloce e sporco) o ottieni un elenco di file e trova il numero più grande e aggiungi 1. Dipende cosa vuoi fare se qualcuno ha "Screenshot" 1 "," Schermata 2 "," Schermata 33 "supponendo che abbiano eliminato un gruppo intermedio, nel caso in cui i successivi siano 3 o 34? –

0

Questo è quello che uso:

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); string newPath; List<string> files = new List<string>(Directory.GetFiles(path,"*.txt",SearchOption.TopDirectoryOnly)); for(int i=0; files.Contains(newPath=string.Format(path + @"\textfile{0}.txt",i)); i++) { Console.WriteLine("File:{0} exist skipping....", newPath); } File.WriteAllText(newPath,"dummy");

2

Ecco una soluzione raffinata inizialmente proposta da Rex M. Sarà generare nomi di file come è stato chiesto il testo della domanda:

public string GetUniqueName(string name, string folderPath) 
{ 
    string pathAndFileName = Path.Combine(folderPath, name); 
    string validatedName = name; 
    int count = 1; 
    while(File.Exists(Path.Combine(folderPath, validatedName))) 
    { 
     validatedName = string.Format("{0}{1}{2}", 
      Path.GetFileNameWithoutExtension(pathAndFileName), 
      count++, 
      Path.GetExtension(pathAndFileName)); 
    } 
    return validatedName; 
} 
Problemi correlati