2009-10-08 24 views
6

He creado un programa de captura de pantalla y todo está funcionando muy bien. El único problema es que no estoy seguro de cómo puedo hacerlo, así que las capturas de pantalla se guardan con los números adjuntos.C# - Agregar número al archivo que se guarda

Ejemplo: Imagen 1, Imagen 2, Imagen 3, Imagen 4, etc.

Obviamente, esto se podría aplicar a otros archivos se salvan. ¿Algunas ideas? Gracias.

+0

Tal vez puede mostrarnos el código que ha escrito hasta ahora ... –

Respuesta

10

Este es un método que uso frecuentemente en este caso. Sólo tiene que pasar en una cadena como "pantalla" y encontrará el nombre del archivo más baja disponible en el formato de "Captura de pantalla [número]" (o simplemente "Captura de pantalla" si no hay ninguna ya):

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: esta es una versión ligeramente simplificada que no tiene en cuenta las extensiones de archivo).

+1

Gracias! Esto es exactamente lo que necesito. Perfeccione cómo busca el nombre de archivo más bajo disponible, con la intención de poner eso en la pregunta. Muchas gracias señor. – user

+2

Usaría 'Path.Combine (folderPath, validatedName)' en lugar de 'folderPath + validatedName'. –

+0

Sarah tiene razón. Sin Path.Combine (folderPath, validatedName) nunca funcionará, ya que tomaría el nombre de la carpeta como parte del nombre del archivo. He puesto el bloque de código corregido debajo propuesto inicialmente por Rex M. – Rahatur

0

Como usted está escribiendo los archivos, un enfoque es buscar en el directorio de guardado actual y encontrar el archivo más nuevo llamado ScreenshotXX, y usar una expresión regular para obtener el número del nombre.

Puede usar la clase DirectoryInfo junto con la clase Regex para esto.

+0

Esto podría romperse fácilmente. ¿Qué sucede si el usuario crea un archivo que tiene el nombre de uno de los archivos de captura de pantalla? ¿Qué pasa si el usuario edita un viejo archivo de captura de pantalla?La solución necesita verificar la existencia de cada archivo hasta que encuentre un "espacio". – jnylen

+0

@jnylen: ¿Qué sucede si el usuario crea un archivo que tiene el nombre de uno de los archivos de captura de pantalla? >> No puede tener dos archivos con nombres idénticos. ¿Qué pasa si el usuario edita un viejo archivo de captura de pantalla? >> La edición de un archivo no tendrá importancia, ya que no modifica la fecha de creación. La solución necesita comprobar la existencia de cada archivo hasta que encuentre un "espacio". >> Cierto. Sin embargo, si no puede escribir el archivo (porque existe), debe aumentar el número hasta que pueda escribir. No creo que busque una brecha es una buena idea, porque si tiene SS1, SS3, SS4, ¿la última captura de pantalla será SS2? – Alan

0

Resumen de solución

  1. Directory.GetFiles (dest);
  2. archivos clasificar los nombres de
  3. analizan último nombre de archivo, encontrar el último número que utilizó
  4. escribir el archivo siguiente con el siguiente número añadido a la misma.

¿Esto funciona para usted?

3

¿Hay alguna razón por la que está usando números? ¿La misma carpeta se reutilizará más adelante para otra sesión? ¿Deben reiniciarse los números y reemplazar los archivos existentes si el día es diferente?

Estos son los tipos de cosas a tener en cuenta. Vale la pena señalar que OS X solía proporcionar "Imagen 1", "Imagen 2" al hacer capturas de pantalla, y afortunadamente en la nueva versión que ahora utiliza "Captura de pantalla tomada el 2009-12-08 a las 11.35.12" o algo similar, lo que permite clasificación más fácil por fecha, evitando fácilmente conflictos de nomenclatura, etc.

Tal como se publicó en otras sugerencias, aún debe verificar si el archivo ya existe y si reintenta DateTime.Now será diferente, por lo que el nombre del archivo será diferente. Por supuesto, no deberías tener ningún conflicto a menos que las capturas de pantalla estén en el mismo milisegundo o que el usuario esté jugando con la fecha/hora (o los ahorros de luz diurna también te pueden hacer perder el control).

+1

Actualmente, los archivos se guardan usando una marca de tiempo. Pero algunas personas me han preguntado si podría incluir una opción que agregue un número al final del nombre del archivo si así es como eligen el archivo que se guardará. Agradezco tu sugerencia – user

+0

En ese caso tiene dos opciones, ya sea mediante el uso de File.Exists cheques con cada número sucesivo (rápido y sucio) o consiga una lista de archivos y encuentre el número más grande y agregue 1. Depende de lo que quiera hacer si alguien tiene "Screenshot 1 "," Captura de pantalla 2 "," Captura de pantalla 33 ", suponiendo que borraron un manojo intermedio, ¿debería ser el siguiente 3 o 34? –

0

Esto es lo que yo 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

Aquí es una solución refinada propuesto inicialmente por Rex M. Se generará nombres de archivo como se pidió en la pregunta real:

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; 
} 
Cuestiones relacionadas