C # При изменении file.txt сохранить копию в папке архива - PullRequest
0 голосов
/ 09 октября 2019

Как я могу определить, когда файл был изменен. Если файл изменен, сохраняйте копию каждый раз в папке «архив». Имя файла будет увеличиваться: файл (1) .txt, файл (2) .txt .....

Мой код ниже шага остановки на 2.

FileInfo fileSettings = new FileInfo(@"c:\path\file.txt");
string archive = @"C:\Users\Desktop\archive\";`

if ( fileSettings.LastWriteTime > DateTime.Today )
{
  int count = 1;
  string woExtension = Path.GetFileNameWithoutExtension(@"c:\path\file.txt");
  string extension = Path.GetExtension(@"c:\path\file.txt");

  string tempFilename = string.Format("{0} ({1})", woExtension, count++);
  fileSettings.CopyTo(Path.Combine(archive + tempFilename + extension));
}

1 Ответ

0 голосов
/ 09 октября 2019

Похоже, что вам нужен алгоритм для копирования файлов с соответственно увеличенными именами файлов. Это сделает то, что вы ищете.

Скажите, это имена каталогов файлов и архивов.

var file = @"Data/A.txt";
var archive = @"Data/Archive";

Мы увидим, удовлетворено ли условие времени последней записи. Если это так, мы перечисляем все файлы в вашем каталоге назначения, которые соответствуют вашему исходному шаблону файлов. То есть он должен начинаться с A, затем он может иметь или не иметь (1) и т. Д. Поэтому перечислены все файлы, такие как A.txt, A(1).txt, A(2).txt. Затем мы приводим в порядок последний из этих файлов (и здесь мы должны быть осторожны при сортировке по длине, если вы просто сортируете по значению, A.txt придет после всех остальных). Затем, используя Regex, мы получаем номер последнего файла, его приращение и копируем файл с новым именем.

if (File.GetLastWriteTime(file) > DateTime.Today)
{
    var fileNameOnly = Path.GetFileNameWithoutExtension(file);
    var ext = Path.GetExtension(file);
    var pattern = fileNameOnly + "*" + ext;

    var lastCopy = Directory.EnumerateFiles(archive, pattern, System.IO.SearchOption.TopDirectoryOnly)
        .OrderBy(x => x.Length)
        .LastOrDefault();

    var newName = fileNameOnly + ext;
    if (lastCopy != null)
    {
        var lastCopyNameOnly = Path.GetFileNameWithoutExtension(lastCopy);
        var match = Regex.Match(lastCopyNameOnly, @"(.+)\((\d+)\)");
        int lastNum = 1;
        if (match.Success)
        {
            int.TryParse(match.Groups[2].Value, out lastNum);
            lastNum++;
        }
        newName = string.Format("{0}({1}){2}", fileNameOnly, lastNum, ext);
    }

    var dest = Path.Combine(archive, newName);
    File.Copy(file, dest);
}

Примечание

Будьте осторожны с var lastNum = 1; initializatin какЧто ж. Вы должны инициализировать 1, а не zero. Потому что если match.Success == false, это означает, что у вас есть только A.txt файл в месте назначения, то ваш следующий файл будет A(1).txt. Если вы инициализировали его как zero, тогда ваш следующий файл будет A(0).txt, что не соответствует желаемому результату.

...