2015-09-23 6 views
1

В C# код, который я поддерживаю, я продолжаю видеть эту картину:Нужно ли уступать между последовательными файловыми операциями?

File.Delete(string.Format("{0}/{1}.png", temp, ProductCode)); 
Thread.Sleep(20); 
File.Delete(string.Format("{0}/{1}.pdf", temp, ProductCode)); 
Thread.Sleep(20); 
File.Delete(string.Format("{0}/{1} - {2}.pdf", temp, ProductCode, ProductName)); 
Thread.Sleep(20); 

MSDN ничего не говорит один, так или иначе, и я хотел бы окончательное мнение, если кто может помочь: это необходимо, чтобы получить процессор между этими последовательными удалениями?

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

+1

Не уверен. При создании кода он, вероятно, потреблял много ресурсов, поэтому они добавили сон. Я лично НЕ использовал бы его. – kevintjuh93

+1

Это не обязательно, но я бы не удалял их, если бы вы были вами, если сумма всех этих задержек 20 мс не отрицательно скажется на программе. Они были поставлены туда с целью, возможно, из-за плохого оборудования, проблем с сетью и т. Д. –

ответ

4

Это программирование вуду. Обычно это вдохновляет программист на то, что File.Delete() не всегда удаляет файл. Довольно неизбежный побочный эффект запуска программ в многозадачной операционной системе, который также позволяет другим процессам открывать файлы.

И есть категория упакованных в термоусадочную оболочку вредоносных программ, которые программисты добровольно устанавливают на своих машинах, что может вызвать задержку. В верхней части списка находится анти-вредоносная программа, следуют поисковые индексы и утилиты облачного хранилища.

Они используют параметр FileSharing.Delete, чтобы открыть файл, чтобы попытаться свести к минимуму их влияние. Как правило, работает нормально, пока вы не делаете такие вещи, как попытка переписать файл сразу после его удаления. Это не работает, файл находится в режиме «Ожидание удаления», и вы получаете пощечину с UnauthorizedAccessException.

Затем программа-жертва имеет тенденцию замечать, что «ожидание бит» помогает избежать исключения. Предоставление другому процессу достаточно времени, чтобы закончить все, что он делает с файлом, и закрыть дескриптор файла. Как только последний дескриптор закрыт, файл фактически исчезает из файловой системы, и воссоздание его не прерывается.

Сон на 20 миллисекундов вполне произволен и довольно маловероятен. Вы никогда не узнаете, как долго ждать, а не многократно пытаться. Задача real состоит в том, что эта стратегия является очень неудачным способом воссоздания файлов. Сначала удаление, поэтому создание и запись файла очень опасно. Как отмечено, удаление работает отлично, но создание его опасно. Когда это пойдет не так, пользователь останется без копии файла. Полная потеря данных. Никогда не очень желательная особенность программы :)

Не использовать вуду. Правильный способ сделать это - создать новый файл, а затем использовать File.Replace(), чтобы поменять его на старый файл, а затем удалить старый файл. Никогда не теряйте данные, вредоносное ПО может немного побороть это. Удаление файла путем перемещения его в корзину также является прекрасным подходом, если это происходит не так часто, FileSystem.DeleteFile() в любимом пространстве имен пользователей.

+0

О, привет Ханс, LTNS. В этом конкретном случае это очистка временных файлов после того, как группа выбранных пользователем документов в комплекте, зашифрована и доставлена ​​в виде загрузки. Это на сервере без каких-либо помех от типов, о которых вы упоминаете. Отличный ответ. Я знаю большую часть этого, но я не был полностью уверен, будут ли операции с файлами правильно стоять в очереди, если я доставляю их в быстрый огонь в том же потоке. Надеюсь, что так ... –

+0

Ну, не делай этого. Используйте FileOptions.DeleteOnClose, и вам никогда не придется сожалеть. –

+0

Ханс предоставил пример кода для этого [в предыдущем ответе] (http: // stackoverflow.ком/а/8964246/18 192). – Brian

 Смежные вопросы

  • Нет связанных вопросов^_^