Pregunta

Necesito ayuda para cambiar el nombre de algunas imágenes en un directorio ubicado en / images / graphicsLib /.

Todos los nombres de imágenes en / graphicsLib / have convención de nomenclatura que se ve así: 400-60947.jpg. Llamamos a la " 400 " parte del archivo es el prefijo y llamamos al " 60957 " parte el sufijo. El nombre completo del archivo al que llamamos sku.

Entonces, si vieras el contenido de / graphicLib / se vería como:
400-60957.jpg
400-60960.jpg
400-60967.jpg
400-60968.jpg
402-60988.jpg
402-60700.jpg
500-60725.jpg
500-60733.jpg
etc ...

Utilizando C # & amp; System.IO, ¿cuál es una forma aceptable de cambiar el nombre de todos los archivos de imágenes en base al prefijo del nombre del archivo? Los usuarios deben poder ingresar el prefijo actual, ver todas las imágenes en la / graphicsLib / que coinciden, luego ingresar el nuevo prefijo para que todos esos archivos cambien de nombre con el nuevo prefijo. Solo se cambia el nombre del prefijo del archivo, el resto del nombre del archivo debe permanecer sin cambios.

Lo que tengo hasta ahora es:

//enter in current prefix to see what images will be affected by
// the rename process,
// bind results to a bulleted list.
// Also there is a textbox called oldSkuTextBox and button
// called searchButton in .aspx


private void searchButton_Click(object sender, EventArgs e)

{

string skuPrefix = oldSkuTextBox.Text;


string pathToFiles = "e:\\sites\\oursite\\siteroot\\images\graphicsLib\\";  

string searchPattern = skuPrefix + "*";

skuBulletedList.DataSource = Directory.GetFiles(pathToFiles, searchPattern);

skuBulletedList.DataBind();

}



//enter in new prefix for the file rename
//there is a textbox called newSkuTextBox and
//button called newSkuButton in .aspx

private void newSkuButton_Click(object sender, EventArgs e)

{

//Should I loop through the Items in my List,
// or loop through the files found in the /graphicsLib/ directory?

//assuming a loop through the list:

foreach(ListItem imageFile in skuBulletedList.Items)

{

string newPrefix  = newSkuTextBox.Text;

//need to do a string split here?
//Then concatenate the new prefix with the split
//of the string that will remain changed?

 }

}
¿Fue útil?

Solución

Puede consultar string.Split .

Recorra todos los archivos en su directorio.

string[] fileParts = oldFileName.Split('-');

Esto te dará una matriz de dos cadenas:

fileParts[0] -> "400"
fileParts[1] -> "60957.jpg"

usando el primer nombre en tu lista.

Tu nuevo nombre de archivo se convierte en:

if (fileParts[0].Equals(oldPrefix))
{
    newFileName = string.Format("(0)-(1)", newPrefix, fileParts[1]);
}

Luego, para cambiar el nombre del archivo:

File.Move(oldFileName, newFileName);

Para recorrer los archivos en el directorio:

foreach (string oldFileName in Directory.GetFiles(pathToFiles, searchPattern))
{
    // Rename logic
}

Otros consejos

En realidad, debes iterar cada uno de los archivos en el directorio y cambiar el nombre uno por uno

Para determinar el nuevo nombre del archivo, puedes usar algo como:

String newFileName = Regex.Replace("400-60957.jpg", @"^(\d)+\-(\d)+", x=> "NewPrefix" + "-" + x.Groups[2].Value);

Para cambiar el nombre del archivo, puedes usar algo como:

File.Move(oldFileName, newFileName);

Si no está familiarizado con las expresiones regulares, debe verificar: http://www.radsoftware.com.au/articles/regexlearnsyntax.aspx

Y descarga este software para practicar: http://www.radsoftware.com.au/regexdesigner/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top