Marc_Moi Ответов: 3

Почему это не работает


Всем Привет,

Я пытаюсь создать небольшую программу, которая переименует все файлы *.MSG в файл *.EDI, а затем скопирует эти файлы *.EDI в архивную папку, а затем переместит их все .EDI в определенную папку.

пока я только пытался переименовать и переехать, но это не работает, и я не знаю почему.

Я был бы очень признателен вам за помощь.

спасибо

Марк.

Что я уже пробовал:

static void Main(string[] args)
        {

            string souceFile = @"\\PATH TO FOLDER\";
            string targetFile = @"\\PATH TO FOLDER\";

            DirectoryInfo d = new DirectoryInfo(@"\\PATH TO FOLDER\");
            FileInfo[] infos = d.GetFiles();
            foreach (string filename in Directory.GetFiles(@"\\PATH TO FOLDER\", "*.MSG", SearchOption.TopDirectoryOnly))
            {
                Path.ChangeExtension(filename, ".EDI");
            }

                        
            foreach (string filename in Directory.GetFiles(@"\\PATH TO FOLDER\", "*.EDI", SearchOption.TopDirectoryOnly))
            {
                    System.IO.File.Move(souceFile, targetFile);
            }

        }

Wendelius

В чем заключается ошибка, которую вы получаете?

Marc_Moi

Привет,
спасибо за ваш ответ.

это просто не работает, я не получаю никаких ошибок. файл остается там без каких-либо изменений, и он не перемещается.

спасибо
Марк

PIEBALDconsult

System.IO.File.Двигаться(souceFile, файл TargetFile);
Я думаю, проблема в том, что вы не хотите, чтобы souceFile был там.

3 Ответов

Рейтинг:
2

BillWoodruff

Добавьте код, чтобы проверить, являются ли пути к файлам и каталогам допустимыми и/или уже существуют:

в системе.ИО:

Файл.Существует: [^]

Каталог.Существует: [^]

Вы можете использовать вызов Path.ChangeExtension в качестве второго аргумента в вызове File.переместить файл.Move(src, Path.ChangeExtension(src, ".xxx"));

для обсуждения проверки в сети:

Цитата:
Когда вы используете System.IO.Directory.Exists, он только дает вам знать, что он не смог найти каталог, но это может быть потому, что каталог на самом деле не существует или потому, что пользователь не имеет достаточных прав доступа к каталогу.
[^]


Wendelius

Очень хорошая мысль.

BillWoodruff

Спасибо!

Рейтинг:
1

Wendelius

Если выполнение кода не дает никаких ошибок, вы должны использовать отладчик, чтобы исследовать, что идет не так. Возможно, путь неверен, и циклы ничего не находят и т. д.

Чтобы использовать отладчик, выполните код построчно и исследуйте переменные, взгляните на Учебник: отладка кода C# - Visual Studio | Microsoft Docs[^]

ADDDITION
Глядя на примеры, в случае использования дословных строк (@) убедитесь, что вы не экранируете разделители папок. Другими словами либо используйте

string souceFile = @"C:\TEMP\";

или
string souceFile = "C:\\TEMP\\";


Marc_Moi

Привет, спасибо за то, что я нашел это в своем коде при отладке.

System.IO.IOException: 'ошибка входа в систему: неизвестное имя пользователя или неверный пароль.
когда я доберусь до строки : FileInfo[] infos = d.GetFiles();

но я не понимаю, почему на машине, где я запускаю программу, у меня есть доступ к этой папке.

Wendelius

Распространенной причиной этого исключения является то, что пользователь, запускающий приложение, не имеет доступа к указанной папке.

Самое главное-это учетная запись, на которой выполняется код. Например, если код выполняется из службы под локальная система учетная запись тогда не имеет доступа к сетевым ресурсам, даже если вы можете иметь эти привилегии при входе на один и тот же компьютер с помощью другой учетной записи. То же самое может произойти и например с ASP.NET приложения, если служба запускается с использованием учетной записи без надлежащих привилегий или, например, при использовании удаленной отладки.

Таким образом, использование соответствующей учетной записи-это один из вариантов, а другой вариант может заключаться в том, чтобы выдать себя за пользователя в коде, см. c# - ошибка входа в систему: неизвестное имя пользователя или неверный пароль.ошибка при доступе к другому серверу - переполнение стека[^]

Marc_Moi

Да,там, где вы видите @"\\путь к папке\", есть \\ в начале причина этого, это сетевая папка, так что @"\\1.1.1.1\abc\" вот почему.

BillWoodruff

+5 Хороший пример обучения навыкам, которые необходимы, а не выполнение работы ОП "за них" !

Wendelius

Спасибо!

Рейтинг:
0

Patrice T

static void Main(string[] args)
        {

        string souceFile = @"\\PATH TO FOLDER\";
        string targetFile = @"\\PATH TO FOLDER\";

...

        foreach (string filename in Directory.GetFiles(@"\\PATH TO FOLDER\", "*.EDI", SearchOption.TopDirectoryOnly))
        {
                // First problem is that souceFile and targetFile have same value.
                // This means that you try to move a file to same place.
                System.IO.File.Move(souceFile, targetFile);
                // Second problem is that the file name is not in the parameters of move.
        }

    }

Вы уверены в этом @"\\ПУТЬ К ПАПКЕ\" есть ли реальный путь ?


Marc_Moi

Я написал путь к папке, ссылка есть реальный путь к сетевой путь.

Patrice T

Совет: покажите какой-нибудь реалистичный код, чтобы получить полезные ответы.

Marc_Moi

Какая будет разница, даже если я поставлю \\1.1.1.1\testfolder\in вы можете представить себе путь к папке. Все остальные люди действительно понимали, что это был has exemple, но код был тот же самый, за исключением пути.
Спасибо