web-dev-qa-db-fra.com

Déplacer des fichiers en C #

Je déplace des images (nom de fichier (1) .PNG, (2) .PNG et ainsi de suite) d'un répertoire à un autre. J'utilise le code suivant:

for (int i = 1; i < n; i++)
{
    try
    {
        from = "E:\\vid\\(" + i + ").PNG";
        to = "E:\\ConvertedFiles\\" + i + ".png";

        File.Move(from, to); // Try to move
        Console.WriteLine("Moved"); // Success
    }
    catch (IOException ex)
    {
        Console.WriteLine(ex); // Write error
    }
}

Cependant, j'obtiens l'erreur suivante:

Une exception de première chance de type System.IO.FileNotFoundException s'est produit dans mscorlib.dll

System.IO.FileNotFoundException: Could not find file 'E:\vid\(1).PNG'.

Je prévois également de renommer les fichiers afin que le nom du fichier converti soit 00001.png, 00002.png ... 00101 et ainsi de suite.

18
MKS

Je vous suggère d'utiliser '@' Afin d'échapper aux barres obliques d'une manière plus lisible. Utilisez également Path.Combine(...) pour concaténer les chemins et PadLeft pour avoir vos noms de fichiers comme spécificités.

for (int i = 1; i < n; i++)
{
    try
    {
        from = System.IO.Path.Combine(@"E:\vid\","(" + i.ToString() + ").PNG");
        to = System.IO.Path.Combine(@"E:\ConvertedFiles\",i.ToString().PadLeft(6,'0') + ".png");

        File.Move(from, to); // Try to move
        Console.WriteLine("Moved"); // Success
    }
    catch (IOException ex)
    {
        Console.WriteLine(ex); // Write error
    }
}
22
Tobia Zambon

Pourquoi n'utilisez-vous pas quelque chose comme ça?

var folder = new DirectoryInfo(@"E:\vid\"));

if (folder.Exists)
{
    var files = folder.GetFiles(".png");
    files.toList().ForEach(f=>File.Move(from,to));
}
2
Keysharpener

L'exception signifie que le fichier E:\vid(1).PNG n'existe pas. Tu veux dire E:\vid1.PNG?

Utilisation System.IO.Path classe pour construire des chemins, c'est mieux que de concaténer des chaînes. Vous n'avez pas à vous soucier d'échapper aux barres obliques inverses.

1
Jakub Konecki
i.ToString()

pourrait vous aider. Tu passes

from = "E:\\vid\\(" + i + ").PNG";
to = "E:\\ConvertedFiles\\" + i + ".png";

I comme entier et la concaténation ne fonctionne pas à cause de cela
et au lieu d'utiliser \\, ajouter @ comme ça

from = @"E:\vid\(" + i + ").PNG";
1
Gustav Klimt

Je viens de l'exécuter dans Visual Studio. Ça a marché.

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace ConsoleApplication2

{

    class Program
    {
        static void Main()
        {
            int n = 3;
            for (int i = 1; i < n; i++)
            {
                string from = "C:\\vid\\(" + i + ").PNG";
                string to = "C:\\ConvertedFiles\\" + i + ".png";
                {
                    try
                    {
                        File.Move(from, to); // Try to move
                        Console.WriteLine("Moved"); // Success
                    }
                    catch (System.IO.FileNotFoundException e)
                    {
                        Console.WriteLine(e); // Write error
                    }
                }
            }
        }
    }

}

Peut-être que lorsque vous déplaciez des fichiers dans le répertoire vid pour commencer le test, les fenêtres supprimaient la parenthèse. (1) .png est devenu 1.png ... J'ai eu une erreur de fichier introuvable à partir de ce phénomène ... sinon, votre code est solide. Ma version est presque identique.

1
BrianK
var folder = new DirectoryInfo(sourcefolder);

if (folder.Exists)
{
    var files = folder.GetFiles("*.png");
    files.ToList().ForEach(f => File.Move(sourcefolder + f, newFolderName + f));
}

Je crois que cela vous aidera.

0
madhan seeman