AdvancedDNA Ответов: 2

Восстановление файлов после перемещения


Так... Я сделал "ой". Довольно большой. Я написал некоторый код для поиска по папкам и всем подкаталогам и извлечения любого найденного PDF-файла. Что я хотел сделать, так это скопировать PDF-файл в новое место, а вместо этого я просто переместил их. Код работал всю ночь, так как я знал, что буду иметь дело с 70k+ файлами, и не хотел замедлять свой компьютер, пытаясь делать другие вещи.
Что мне нужно сделать, так это вернуть их обратно. Проблема здесь в том, что каждый файл имеет уникальное имя и пришел из папки с очень похожим именем. Например: название файла ULT00004605_20161105.формат PDF происходил из подкаталоге с именем ULT00004605.
Кто-нибудь знает, как проиндексировать подкаталоги и вернуть их туда, откуда они пришли?
Код, который я использовал для их перемещения, находится в разделе "Что я пробовал?". Вы можете видеть, что я использовал MoveTo, когда должен был использовать CopyTo.

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

String path = @"S:\QS Storage Server\DHR\ULT\";
 String directoryName = @"G:\SHARED\MoveMe\SNHR_To_Upload\";
            DirectoryInfo dirInfo = new DirectoryInfo(directoryName);
            if (dirInfo.Exists == false)
            {
                Directory.CreateDirectory(directoryName);
            }

            List<String> SNHRFiles = Directory.GetFiles(path, "*.pdf*", SearchOption.AllDirectories).ToList();

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

j snooze

Если вы смогли выполнить поиск по всем папкам и подкаталогам, чтобы получить файлы, которые вы переместили, как вы не можете выполнить поиск по всем файлам и подкаталогам, в которые вы переместили файлы? Я ничего не понимаю.

AdvancedDNA

в основном потому, что имена файлов не совсем совпадают с именами папок и строкой.Contains не работает, и нет никакого "like"%, как есть в SQL. Папка, к которой принадлежал файл, может быть глубиной 5-7 папок, и у меня возникают трудности.

2 Ответов

Рейтинг:
7

AdvancedDNA

Поскольку папки уже содержали другие файлы, которые я не хотел удалять или перемещать, окончательное решение было немного более глубоким, чем ответ Meciej Los, но его вклад помог мне понять это. Вот окончательный код.

String ToPath = @"O:\QS Storage Server\DHR Storage\ULT\";
          String FromPath = @"O:\QS Storage Server\DHR Storage\ULT\SNHR_To_Upload\";

          DirectoryInfo FromdirInfo = new DirectoryInfo(FromPath);
          DirectoryInfo TodirInfo = new DirectoryInfo(ToPath);

          List<String> SNHRFilesToMoveBack = Directory.GetFiles(FromPath, "*.pdf*", SearchOption.AllDirectories).ToList();
          List<String> FoldersForMoveBack = Directory.GetDirectories(ToPath, "*.*", SearchOption.AllDirectories).ToList();

          foreach (string folder in FoldersForMoveBack)
          {
              //search the SNHR_To_Upload folder for the file that matches the folder name
              DirectoryInfo mDirectory = new DirectoryInfo(folder);
              string folderToCopyTo = mDirectory.Name;
              foreach (string file in SNHRFilesToMoveBack)
              {
                  FileInfo mFile = new FileInfo(file);
                  string FileName = Path.GetFileName(file);
                  string ShortName = FileName.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries)[0];
                  if (folderToCopyTo == ShortName)
                  {
                      try
                      {
                          mFile.MoveTo(mDirectory + "\\" + mFile.Name);
                      }
                      catch (Exception nope)
                      {
                          MessageBox.Show("Cannot Find File" + nope);
                          continue;
                      }
                  }
              }
          }


Maciej Los

5 за старание!
КСТАТИ:
предлагаю заменить:
mFile.MoveTo(mDirectory + "\\" + mFile.Name);
с:
mFile.MoveTo(Path.Combine(mDirectory, mFile.Name));
Видеть: Путь.Сочетание Методов (Строка, Строка) (Система.ИО)[^]

Рейтинг:
14

Maciej Los

Это довольно легко решить. Все, что вам нужно сделать, это получить имя папки из имени файла. Видеть:

string sFullFileName = @"G:\SHARED\MoveMe\SNHR_To_Upload\ULT00004605_20161105.pdf";
string sDestPathName = @"S:\QS Storage Server\DHR\ULT\";

string sShortFileName = Path.GetFileName(sFullFileName);
string sDestFolderName = sShortFileName.Split(new string[]{"_"}, StringSplitOptions.RemoveEmptyEntries)[0];

Console.WriteLine("File: '{0}' will be copied to: '{1}'", sShortFileName, Path.Combine(sDestPathName, sDestFolderName));

Результат:
File: 'ULT00004605_20161105.pdf' will be copied to: 'S:\QS Storage Server\DHR\ULT\ULT00004605'