Перемещение файлов в C#

я перемещаю некоторые изображения (имя файла как (1).PNG, (2).PNG и так далее) из одного каталога в другой. Я использую следующий код:

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
    }
}

тем не менее, я получаю следующую ошибку:

первый шанс исключение типа System.IO.FileNotFoundException произошло в mscorlib.dll файлы

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

кроме того, я планирую переименовать файлы, чтобы преобразованное имя файла было 00001.png, 00002.формат PNG... 00101 и так далее.

6 ответов


Я предлагаю вам использовать '@' чтобы избежать косых черт более читаемым способом. Также использовать Path.Combine(...) для объединения путей и PadLeft для того, чтобы ваши имена как свои особенности.

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
    }
}

почему бы вам не использовать что-то вроде этого?

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

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

исключение означает, что файл E:\vid(1).PNG не существует. Вы имеете в виду E:\vid1.PNG?

использовать System.IO.Path класс для построения путей, это лучше, чем конкатенация строк. Вам не придется беспокоиться о escapting обратные слеши.


Я только что запустил это в Visual Studio. Это сработало.

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
                    }
                }
            }
        }
    }

}

возможно, когда вы перемещали файлы в каталог vid, чтобы начать тест, windows сбрила скобки. (1).png стал 1.формат PNG... Я получил файл, который не нашел ошибку от этого явления... в противном случае, ваш код является твердой. Моя версия почти идентична.


i.ToString()

может помочь вам. Вы проходите

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

I как целое число и конкатенация не работает из-за этого
и вместо использования \ добавьте @ такой

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

var folder = new DirectoryInfo(sourcefolder);

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

Я считаю, что это поможет.