s23user Ответов: 1

System.io.ioexception: процесс не может получить доступ к файлу, поскольку он используется другим процессом. .


Привет, что я делаю, так это создаю dir watcher, который будет смотреть dir, например "A" , и копировать файл с определенным именем в другую папку, как только он увидит файл в dir A в пункт назначения dir B. Я бросил файл в директорию "а", и он сработал. но когда я запустил программу на своем локальном компьютере и установил dir для просмотра и destination dir на сервере, она выдает мне следующую ошибку.
Как мне с этим справиться?
Необработанное исключение: System.IO.IOException: процесс не может получить доступ к файлу '\\IP-exapp-101\c$\WorkDir\WatchedDir\_f$12345.dat', поскольку он используется другим процессом.
в системе.ИО.__Ошибка.WinIOError(Int32 errorCode, String maybeFullPath)
в системе.ИО.Файл.InternalCopy(строка имя_файла_исходного_кода, Строковый параметр destfilename, логическое перезаписать, логическое checkHost)
в системе.ИО.Файл.Копия(строка имя_файла_исходного_кода, Строковый параметр destfilename)
в iSpy_File.Программа.OnChanged(Object source, FileSystemEventArgs e) in c:\users\xuser\documents\visual studio 2015\Projects\iSpy_File\iSpy_File\Program. cs: строка 68
в System.IO.FileSystemWatcher.OnCreated(FileSystemEventArgs e)
в System.IO.FileSystemWatcher.NotifyFileSystemEventArgs(Int32 action, String name)
в System.IO.FileSystemWatcher.CompletionStatusChanged(uint32 errorCode, UInt32 numBytes, NativeOverlapped* overlappedPointer)
в системе.Нарезание резьбы._IOCompletionCallback.PerformIOCompletionCallback(uint32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

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

Я попытался заглянуть в интернет..
мой код:
my code:
public static void Run()
{
string[] args = System.Environment.GetCommandLineArgs();
// If a directory is not specified, exit program.
if (args.Length != 3)
{
// Display the proper way to call the program.
Console.WriteLine("Please Provide Source and destination directory: iSpy_Folder.exe <Source dir> <Destination dir>");
return;
}
// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];
/* 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 = "*.*";
//// will track changes in sub-folders as well
watcher.IncludeSubdirectories = true;
// 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 Program.");
while (Console.Read() != 'q') ;
}
// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
string[] args = System.Environment.GetCommandLineArgs();
// Specify what is done when a file is changed, created, or deleted.
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
if ("_F$"== e.FullPath.Substring(e.FullPath.LastIndexOf("\\")+1, 3).ToUpper())
{
if (File.Exists(e.FullPath))
{
File.Copy(e.FullPath, args[2] + "\\" + e.FullPath.Substring(e.FullPath.LastIndexOf("\\")));
Console.WriteLine("File Copied");
}
}
}

1 Ответов

Рейтинг:
2

Dave Kreskowiak

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

Ваш код должен подождать. Либо подождите произвольное количество времени, пока файл будет закрыт, и / или попытайтесь выполнить свою файловую операцию, а если это не удастся, подождите определенное количество времени и повторите операцию снова и снова, пока она не сработает.