Как клонировать файлы при их открытии в 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);
}
}
}
и тут все норм но здесь
здесь он не делает копию и не отслеживает файл почему то
Подскажите, переправьте меня. Что и как мне нужно сделать. Гуглил много, но мало что нашел, а что нашел то и написал. Заранее спасибо.
