Как клонировать файлы при их открытии в C#?

Я пытаюсь отслеживать файлы любых форматов, например, .docx, .jpg, .txt. При их открытии программа создает полноценную копию. В принципе все работает, но только с форматом .docx, хотя я указал все необходимое для чтения любых форматов, а читает почему-то только его. Вот мой код:

public partial class Form1 : Form
{
    private string directoryPath; // Переменная для хранения выбранной директории
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())
        {
            folderBrowserDialog.Description = "Выберите директорию";
            folderBrowserDialog.RootFolder = Environment.SpecialFolder.Desktop;

            DialogResult result = folderBrowserDialog.ShowDialog();

            if (result == DialogResult.OK)
            {
                directoryPath = folderBrowserDialog.SelectedPath;
                MessageBox.Show("Выбранная директория: " + directoryPath);
            }
            else
            {
                MessageBox.Show("Выбор директории отменен.");
                return; // Если выбор директории был отменен, то выход из метода
            }
        }

        //string fileExtensionFilter = "*.docx";
        string suffix = "_copy";
        FileSystemWatcher watcher = new FileSystemWatcher(directoryPath);
        watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
        watcher.Filter = "*.*";
        watcher.Created += async(s, args) =>
        {
            string newFilePath = args.FullPath;
            string fileName = Path.GetFileName(newFilePath);
            string fileExtension = Path.GetExtension(fileName);

            if (fileName.StartsWith("~") || fileExtension.Equals(".jpg", StringComparison.OrdinalIgnoreCase) || fileExtension.Equals(".txt", StringComparison.OrdinalIgnoreCase))
            {
                string copyFileName = fileName.StartsWith("~") ? fileName.Substring(1) : Path.GetFileNameWithoutExtension(fileName) + suffix + fileExtension;
                string copyFilePath = Path.Combine(directoryPath, copyFileName2);

                await CopyFileSafelyAsync(newFilePath, copyFilePath);

                MessageBox.Show($"Создана копия файла: {copyFileName2}");
            }
        };

        watcher.EnableRaisingEvents = true;

        MessageBox.Show("Отслеживание файлов началось. Для завершения работы нажмите ОК.");
    }

    private static async Task CopyFileSafelyAsync(string sourcePath, string destinationPath)
    {
        while (IsFileInUse(sourcePath))
        {
            // Подождите, пока файл не освободится
            await Task.Delay(1000); // Можно увеличить задержку, если это необходимо
        }

        await CopyFileAsync(sourcePath, destinationPath);
    }

    private static bool IsFileInUse(string filePath)
    {
        try
        {
            using (FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None))
            {
                // Если файл можно открыть для чтения, это означает, что он не заблокирован другим процессом
                return false;
            }
        }
        catch (IOException)
        {
            // Файл заблокирован другим процессом
            return true;
        }
    }
    private static async Task CopyFileAsync(string sourcePath, string destinationPath)
    {
        using (FileStream sourceStream = File.Open(sourcePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        using (FileStream destinationStream = File.Create(destinationPath))
        {
            await sourceStream.CopyToAsync(destinationStream);
        }
    }
}

и вот мой результат: введите сюда описание изображения

и тут все норм но здесь введите сюда описание изображенияздесь он не делает копию и не отслеживает файл почему то

Подскажите, переправьте меня. Что и как мне нужно сделать. Гуглил много, но мало что нашел, а что нашел то и написал. Заранее спасибо.


Ответы (0 шт):