Есть проблема: Сделал виндовый сервис, который проверяет некую структуру папок локально и на CreateFile должен этот файл переименовать.
Пишу так
System.IO.File.Move(sourcePath, fullDistPath);
Если я копирую файл в эту структуру локально, то все нормально. Если я копирую файл из сети, то выдается ошибка
The process cannot access the file "D:\blabla\blabla\blabla\blabla\ДККД -1ЗН-ПС 20048301835610.DOC" because it is being used by another process.
Исходный файл ДККД -1ЗН-ПС.DOC
Переименованный файл ДККД -1ЗН-ПС 20048301835610.DOC
Помогите разобраться пожалуйста.
Здравствуйте, Banch, Вы писали:
B>Здравствуйте, godwizard, Вы писали:
G>>The process cannot access the file "D:\blabla\blabla\blabla\blabla\ДККД -1ЗН-ПС 20048301835610.DOC" because it is being used by another process.
B>на локумльном диске скорее всего файл успевает создасться и ты его спокойно переименовываешь, а на сетевом все идет дольше и к моменту переименования он еще не дописан
B>попробуй подожать в цикле и пробовать переименовывать
Ну в принципе я так и сделал. Сначала вызвал FileInfo и увидел, что length нулевая. Затем решил написать циклическую функцию
private void FileMove(string _source, string _target)
{
try
{
System.IO.File.Move(_source, _target);
}
catch(System.IO.IOException ioex)
{
Thread.Sleep(5000);
FileMove(_source, _target);
}
}
Может кому и пригодится. У меня работа и с сетью и с веб-папками. Метод работает как часы.
Здравствуйте, godwizard, Вы писали:
G>G>private void FileMove(string _source, string _target)
G>{
G> try
G> {
G> System.IO.File.Move(_source, _target);
G> }
G> catch(System.IO.IOException ioex)
G> {
G> Thread.Sleep(5000);
G> FileMove(_source, _target);
G> }
G>}
G>
только лучше это в цикле делать, а не рекурсивно ...
Здравствуйте, Banch, Вы писали:
B>Здравствуйте, godwizard, Вы писали:
G>>G>>private void FileMove(string _source, string _target)
G>>{
G>> try
G>> {
G>> System.IO.File.Move(_source, _target);
G>> }
G>> catch(System.IO.IOException ioex)
G>> {
G>> Thread.Sleep(5000);
G>> FileMove(_source, _target);
G>> }
G>>}
G>>
B>только лучше это в цикле делать, а не рекурсивно ...
А что будет в цикле условием выхода?
Здравствуйте, godwizard, Вы писали:
G>А что будет в цикле условием выхода?
Да то же самое, что и в рекурсии (в данном случае — exception), только память на стек жраться не будет.
Здравствуйте, godwizard, Вы писали:
G>А что будет в цикле условием выхода?
Может так?
for(;;)
{
try
{
File.Move(oldName, newName);
break;
}
catch(FileNotFoundException){break;}
catch{Thread.Sleep(5000);}
}
Regards