File Watcher и программа File.copy путаница

Здравствуйте, сообщество переполнения стека, я все еще изучаю основы C# и мне нужно некоторое руководство. Я прочитал много материалов на сайте Microsoft, и Stack Overflow тоже, но не нашел решения. Моя проблема в том, что я пытаюсь настроить свою программу File Watcher так, чтобы при добавлении новых файлов они не перезаписывались в целевой каталог, а добавлялись. Кажется, я могу получить только один файл для создания в каталоге назначения, и любые другие новые созданные файлы перезаписаны.

Другая моя задача - отразить файл, который создается в каталоге назначения. Например, если я создаю пустой файл.bmp, в целевой каталог по умолчанию добавляется файл "what.txt". Я вставил свой код ниже и приветствую любые мысли. Спасибо любезно ТАК сообщество.

using System;
using System.IO;
using System.Security.Permissions;


namespace Generac_fileWatcher
{


public class FileWatcher
{
    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public static void Run()
    {
        //string[] args = System.Environment.GetCommandLineArgs();

        //// If a directory is not specified, exit program.
        //if (args.Length != 2)
        //{
        //    // Display the proper way to call the program.
        //    Console.WriteLine("Usage: Watcher.exe (directory)");
        //    return;
        //}

        // Create a new FileSystemWatcher and set its properties.
        FileSystemWatcher watcher = new FileSystemWatcher();
        //watcher.Path = args[1];
        watcher.Path = @"C:\Users\mterpeza\Documents\visual studio 2012\Projects\Generac_fileWatcher\Generac_fileWatcher\FilesToWatch";
        /* Watch for changes in LastAccess and LastWrite times, and
           the renaming of files or directories. */
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        // Only watch text files.
        watcher.Filter = ""; 

        // Add event handlers.
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnRenamed);

        // Begin watching.
        watcher.EnableRaisingEvents = true;

        // Wait for the user to quit the program.
        Console.WriteLine("Press \'q\' to quit the sample.");
        while (Console.Read() != 'q') ;
    }

    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
        Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
        File.Copy(e.FullPath, @"C:\Users\mterpeza\Documents\Visual Studio 2012\Projects\Generac_fileWatcher\Generac_fileWatcher\SyncedDirectory\whatever.txt", true);
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
    }
}
}

1 ответ

Решение

Вы жестко задаете имя файла скопированного файла.

File.Copy(e.FullPath, @"C:\Users\mterpeza\Documents\Visual Studio 2012\Projects\Generac_fileWatcher\Generac_fileWatcher\SyncedDirectory\whatever.txt", true);

Все файлы будут скопированы как "what.txt" в SyncedDirectory, что означает, что все файлы после первого будут перезаписаны, поскольку в каталоге может быть только один файл с заданным именем. Если вы хотите, чтобы скопированный файл использовал свое собственное имя, вы должны сделать что-то вроде следующего.

//note that targetDirectory does NOT contain 'whatever.txt'
var targetDirectory = @"C:\Users\mterpeza\Documents\Visual Studio 2012\Projects\Generac_fileWatcher\Generac_fileWatcher\SyncedDirectory\";
var targetPath = Path.Combine(targetDirectory, e.Name);
File.Copy(e.FullPath, targetPath, true);

Таким образом, каждый файл будет сохранять свое имя при копировании, но все равно будет идти в указанный вами каталог.

Другие вопросы по тегам