2009-03-25 23 views

Respuesta

82

Echa un vistazo a FileInfo.

hacer algo como esto:

void RenameThem() 
{ 
    DirectoryInfo d = new DirectoryInfo("c:/dir/"); 
    FileInfo[] infos = d.GetFiles("*.myfiles"); 
    foreach(FileInfo f in infos) 
    { 
     // Do the renaming here 
     File.Move(f.FullName, Path.Combine(f.DirectoryName, "1" + f.Name)); 
    } 
} 
+15

use Path.Combine (f.Directory.ToString(), "1" + f.Name) en lugar de "1" + f.FullName –

8

La función que está buscando es File.Move(source, destination) del System.IO espacio de nombres. También eche un vistazo a la clase DirectoryInfo (del mismo espacio de nombres) para acceder al contenido de la carpeta.

8

Voy a volcar esto aquí ya que tenía que escribir este código para mis propios fines.

using System; 
using System.IO; 

public static class FileSystemInfoExtensions 
{ 
    public static void Rename(this FileSystemInfo item, string newName) 
    { 
     if (item == null) 
     { 
      throw new ArgumentNullException("item"); 
     } 

     FileInfo fileInfo = item as FileInfo; 
     if (fileInfo != null) 
     { 
      fileInfo.Rename(newName); 
      return; 
     } 

     DirectoryInfo directoryInfo = item as DirectoryInfo; 
     if (directoryInfo != null) 
     { 
      directoryInfo.Rename(newName); 
      return; 
     } 

     throw new ArgumentException("Item", "Unexpected subclass of FileSystemInfo " + item.GetType()); 
    } 

    public static void Rename(this FileInfo file, string newName) 
    { 
     // Validate arguments. 
     if (file == null) 
     { 
      throw new ArgumentNullException("file"); 
     } 
     else if (newName == null) 
     { 
      throw new ArgumentNullException("newName"); 
     } 
     else if (newName.Length == 0) 
     { 
      throw new ArgumentException("The name is empty.", "newName"); 
     } 
     else if (newName.IndexOf(Path.DirectorySeparatorChar) >= 0 
      || newName.IndexOf(Path.AltDirectorySeparatorChar) >= 0) 
     { 
      throw new ArgumentException("The name contains path separators. The file would be moved.", "newName"); 
     } 

     // Rename file. 
     string newPath = Path.Combine(file.DirectoryName, newName); 
     file.MoveTo(newPath); 
    } 

    public static void Rename(this DirectoryInfo directory, string newName) 
    { 
     // Validate arguments. 
     if (directory == null) 
     { 
      throw new ArgumentNullException("directory"); 
     } 
     else if (newName == null) 
     { 
      throw new ArgumentNullException("newName"); 
     } 
     else if (newName.Length == 0) 
     { 
      throw new ArgumentException("The name is empty.", "newName"); 
     } 
     else if (newName.IndexOf(Path.DirectorySeparatorChar) >= 0 
      || newName.IndexOf(Path.AltDirectorySeparatorChar) >= 0) 
     { 
      throw new ArgumentException("The name contains path separators. The directory would be moved.", "newName"); 
     } 

     // Rename directory. 
     string newPath = Path.Combine(directory.Parent.FullName, newName); 
     directory.MoveTo(newPath); 
    } 
} 
+2

¡No hay método de cambio de nombre en System.IO.FileInfo! – Chris

+3

@Chris Cuál es exactamente la razón por la cual Journey escribió el método de extensión 'Rename()' para 'FileInfo'. – svick

+0

@svick doh! eso me enseñará a no desplazarme hacia abajo y leer TODO el código. Mi error. – Chris

0

Usted puede utilizar File.Move, así:

string oldFilePath = Path.Combine(Server.MapPath("~/uploads"), "oldFileName"); 
string newFilePath = Path.Combine(Server.MapPath("~/uploads"), "newFileName"); 

File.Move(oldFilePath, newFilePath); 
0

En .NET Framework 4.0 utilizo FileInfo.MoveTo() método que sólo toma 1 argumento

sólo para mover los archivos de mi método es el siguiente

private void Move(string sourceDirName, string destDirName) 
{ 
    DirectoryInfo dir = new DirectoryInfo(sourceDirName); 
    FileInfo[] files = null; 

    files = dir.GetFiles(); 

    foreach (FileInfo file in files) 
    { 
     string temppath = Path.Combine(destDirName, file.Name); 
     file.MoveTo(temppath); 
    } 
} 

para cambiar el nombre de los archivos de mi método se ve así

private void Rename(string folderPath) 
{ 
    int fileCount = 0; 

    DirectoryInfo dir = new DirectoryInfo(folderPath); 

    files = dir.GetFiles(); 

    foreach (FileInfo file in files) 
    { 
     fileCount += 1; 
     string newFileName = fileCount.ToString() + file.Name; 
     string temppath = Path.Combine(folderPath, newFileName); 

     file.MoveTo(temppath); 
    } 
} 

como se puede ver cambiar el nombre de la sintaxis del archivo que es casi lo mismo que para moverlo, sólo tiene que modificar el filename antes de usar MoveTo() método.

Cuestiones relacionadas