web-dev-qa-db-fra.com

Déplacez tous les fichiers des sous-dossiers dans un autre dossier à l’aide de c #

Mon chemin source est C:\Music\ dans lequel j'ai des centaines de dossiers appelés Album-1, Album-2, etc.

Ce que je veux faire, c'est créer un dossier appelé Consolidated dans mon chemin source. 
Ensuite, je souhaite déplacer tous les fichiers de mes albums vers le dossier Consolidated, afin que tous les fichiers de musique soient stockés dans un dossier.

Comment puis-je faire ceci ?

13
Anuya

Essayez comme ça

String directoryName = "C:\\Consolidated";
DirectoryInfo dirInfo = new DirectoryInfo(directoryName);
if (dirInfo.Exists == false)
    Directory.CreateDirectory(directoryName);

List<String> MyMusicFiles = Directory
                   .GetFiles("C:\\Music", "*.*", SearchOption.AllDirectories).ToList();

foreach (string file in MyMusicFiles)
{
    FileInfo mFile = new FileInfo(file);
    // to remove name collisions
    if (new FileInfo(dirInfo + "\\" + mFile.Name).Exists == false) 
    {
         mFile.MoveTo(dirInfo + "\\" + mFile.Name);
    }
}

Tous les fichiers du dossier "C:\Music" (y compris les fichiers du sous-dossier) seront transférés dans le dossier de destination. Le SearchOption.AllDirectories fera une recherche récursive dans tous les sous-dossiers.

32
Thorin Oakenshield
 public void MoveDirectory(string[] source, string target)
    {
        var stack = new Stack<Folders>();
        stack.Push(new Folders(source[0], target));
        while (stack.Count > 0)
        {
            var folders = stack.Pop();
            Directory.CreateDirectory(folders.Target);
            foreach (var file in Directory.GetFiles(folders.Source, "*.*"))
            {
                string targetFile = Path.Combine(folders.Target, Path.GetFileName(file));
                if (File.Exists(targetFile)) File.Delete(targetFile); File.Move(file, targetFile);
            }
            foreach (var folder in Directory.GetDirectories(folders.Source))
            {
                stack.Push(new Folders(folder, Path.Combine(folders.Target, Path.GetFileName(folder))));
            }
        }
        Directory.Delete(source[0], true);
    } 
}


public class Folders { 
    public string Source { 
        get; private set; 
    } 
    public string Target { 
        get; private set; 
    } 
    public Folders(string source, string target) { 
        Source = source; 
        Target = target; 
    } 
}
3
Asif

En gros, cela peut être fait avec Directory.Move:

                try
                {
                    Directory.Move(source, destination);
                }
                catch { }

ne vois aucune raison pour laquelle vous ne devriez pas utiliser cette fonction. C'est récursif et optimisé en vitesse 

2
Arsen Zahray

Vous pouvez utiliser l’objet Directory pour cela, mais vous pourriez rencontrer des problèmes si vous avez le même nom de fichier dans plusieurs sous-répertoires (par exemple, album1\1.mp3, album2\1.mp3). Vous aurez donc peut-être besoin d’un peu plus de logique pour insérez quelque chose d'unique sur les noms (par exemple, album1-1.mp4).

    public void CopyDir( string sourceFolder, string destFolder )
    {
        if (!Directory.Exists( destFolder ))
            Directory.CreateDirectory( destFolder );

        // Get Files & Copy
        string[] files = Directory.GetFiles( sourceFolder );
        foreach (string file in files)
        {
            string name = Path.GetFileName( file );

            // ADD Unique File Name Check to Below!!!!
            string dest = Path.Combine( destFolder, name );
            File.Copy( file, dest );
        }

        // Get dirs recursively and copy files
        string[] folders = Directory.GetDirectories( sourceFolder );
        foreach (string folder in folders)
        {
            string name = Path.GetFileName( folder );
            string dest = Path.Combine( destFolder, name );
            CopyDir( folder, dest );
        }
    }
2
Zachary

Quelque chose comme ça devrait vous faire avancer. Vous devrez ajouter une vérification d'erreur et ce qui ne l'est pas (Que se passe-t-il s'il existe un sous-répertoire de source nommé "Consolidated"? Que se passe-t-il si Consolidated existe déjà? Etc.) C'est de la mémoire, pardonnez donc les erreurs de syntaxe, etc.

string source = @"C:\Music";
string[] directories = Directory.GetDirectories(source);
string consolidated = Path.Combine(source, "Consolidated")
Directory.CreateDirectory(consolidated);
foreach(var directory in directories) {
    Directory.Move(directory, consolidated);
}
1
jason

MSDN: msdn.Microsoft.com/en-us/library/bb762914.aspx

private void DirectoryCopy(
            string sourceDirName, string destDirName, bool copySubDirs)
        {
            DirectoryInfo dir = new DirectoryInfo(sourceDirName);
            DirectoryInfo[] dirs = dir.GetDirectories();

            // If the source directory does not exist, throw an exception.
            if (!dir.Exists)
            {
                throw new DirectoryNotFoundException(
                    "Source directory does not exist or could not be found: "
                    + sourceDirName);
            }

            // If the destination directory does not exist, create it.
            if (!Directory.Exists(destDirName))
            {
                Directory.CreateDirectory(destDirName);
            }


            // Get the file contents of the directory to copy.
            FileInfo[] files = dir.GetFiles();

            foreach (FileInfo file in files)
            {
                // Create the path to the new copy of the file.
                string temppath = Path.Combine(destDirName, file.Name);

                // Copy the file.
                file.CopyTo(temppath, false);
            }

            // If copySubDirs is true, copy the subdirectories.
            if (copySubDirs)
            {

                foreach (DirectoryInfo subdir in dirs)
                {
                    // Create the subdirectory.
                    string temppath = Path.Combine(destDirName, subdir.Name);

                    // Copy the subdirectories.
                    DirectoryCopy(subdir.FullName, temppath, copySubDirs);
                }
            }
        }
0
dekdev
class Program
{
    static void Main(string[] args)
    {
        movedirfiles(@"E:\f1", @"E:\f2");
    }
    static void movedirfiles(string sourdir,string destdir)
    {
        string[] dirlist = Directory.GetDirectories(sourdir);

        moveallfiles(sourdir, destdir);
        if (dirlist!=null && dirlist.Count()>0)
        {
            foreach(string dir in dirlist)
            {
                string dirName = destdir+"\\"+ new DirectoryInfo(dir).Name;
                Directory.CreateDirectory(dirName);
                moveallfiles(dir,dirName);
            }
        }

    }
    static void moveallfiles(string sourdir,string destdir)
    {
        string[] filelist = Directory.GetFiles(sourdir);
        if (filelist != null && filelist.Count() > 0)
        {
            foreach (string file in filelist)
            {
                File.Copy(file, string.Concat(destdir, "\\"+Path.GetFileName(file)));
            }
        }
    }

}
0
        String directoryName = @"D:\NewAll\";
        DirectoryInfo dirInfo = new DirectoryInfo(directoryName);
        if (dirInfo.Exists == false)
            Directory.CreateDirectory(directoryName);

        List<String> AllFiles= Directory
                           .GetFiles(@"D:\SourceDirectory\", "*.*", SearchOption.AllDirectories).ToList();

        foreach (string file in AllFiles)
        {
            FileInfo mFile = new FileInfo(file);

            // to remove name collisions
            if (new FileInfo(dirInfo + "\\" + mFile.Name).Exists == false)
            {
                mFile.MoveTo(dirInfo + "\\" + mFile.Name);
            }
            else
            {
                string s = mFile.Name.Substring(0, mFile.Name.LastIndexOf('.'));

                int a = 0;
                while (new FileInfo(dirInfo + "\\" + s + a.ToString() + mFile.Extension).Exists)
                {
                    a++;
                }
                mFile.MoveTo(dirInfo + "\\" + s + a.ToString() + mFile.Extension);
            }
        }
0
Joe Carpenter

Cela vous sera probablement utile pour dédoubler vos fichiers MP3 portant un nom de fichier différent mais le même titre.

source de David @ msdn !

byte[] b = new byte[128];
string sTitle;
string sSinger;
string sAlbum;
string sYear;
string sComm;
FileStream fs = new FileStream(file, FileMode.Open);
fs.Seek(-128, SeekOrigin.End);
fs.Read(b, 0, 128);
bool isSet = false;
String sFlag = System.Text.Encoding.Default.GetString(b, 0, 3);
if (sFlag.CompareTo("TAG") == 0)
{
System.Console.WriteLine("Tag   is   setted! ");
isSet = true;
}
if (isSet)
{
//get   title   of   song; 
sTitle = System.Text.Encoding.Default.GetString(b, 3, 30);
System.Console.WriteLine("Title: " + sTitle);
//get   singer; 
sSinger = System.Text.Encoding.Default.GetString(b, 33, 30);
System.Console.WriteLine("Singer: " + sSinger);
//get   album; 
sAlbum = System.Text.Encoding.Default.GetString(b, 63, 30);
System.Console.WriteLine("Album: " + sAlbum);
//get   Year   of   publish; 
sYear = System.Text.Encoding.Default.GetString(b, 93, 4);
System.Console.WriteLine("Year: " + sYear);
//get   Comment; 
sComm = System.Text.Encoding.Default.GetString(b, 97, 30);
System.Console.WriteLine("Comment: " + sComm);
}
System.Console.WriteLine("Any   key   to   exit! ");
System.Console.Read();
0
William Gates