2009-11-23 2 views
0

Я хочу удалить некоторые файлы, но только если они не используются. То, что я сделал, было попыткой/уловкой:быстрый способ удаления файлов

Try 
     My.Computer.FileSystem.DeleteFile(fileInfo.FullName) 
    Catch ex As Exception 

    End Try 

но кажется, что этот метод очень медленный, если я пытаюсь удалить некоторые файлы по сети.

Есть ли более быстрый способ удаления файлов? Быстрее ли сначала проверять, открыт ли файл? Если да, как я могу проверить, открыт ли файл?

Сердечные приветы Нико

ответ

1

Если проблема медленной сети связи, все, что вы можете сделать о нем получить более быструю сеть. Возникает ли проблема только по сети?

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

1

Одной из основных проблем с идеей является, конечно, то, что это по своей сути условие гонки. Файл, который используется | сейчас | не могут быть использованы | сейчас | и наоборот. Это может по-прежнему быть полезным для повышения производительности. Тем не менее, я подозреваю, что вы пытаетесь удалить несколько файлов, несмотря на то, что куде показывается удаление только одного. Вероятно, имеет смысл использовать threadpool для этого, так как вы можете попробовать несколько удалений параллельно.

[править]

Я также заметил, что вы используете My.Computer.FileSystem.DeleteFile(String). Это имеет небольшую проблему; ему нужно снова найти файл по имени. Это не самая дешевая операция в сети. SHFileOperation может быть более эффективным, но это сложная встроенная функция API.

+0

Если основная проблема заключается в пропускной способности сети, ThreadPool не может помочь. – SLaks

+1

Но это может быть, если проблема в латентности. – Joren

+0

@MSalters: вы уверены в поиске имени? Я не думаю, что 'FileInfo' может пропустить поиск имени при вызове' Delete'. «FileInfo» не должен соответствовать существующему файлу, даже не существующему каталогу. Конечно, ситуация может быть разной для сетевых акций, но я так не думаю. Кроме того, сначала необходимо создать экземпляры 'FileInfo', и даже если вы получите их путем итерации по каталогу, они, вероятно, построены с использованием обычного конструктора. –

1

Возможно, вам лучше использовать более конкретное исключение, называемое IOException. Что касается удаления файлов из сети, в результате, очевидно, будет латентность, помните, что файлы в сети будут открываться другими. Вы можете проверить свойство LastAccessTime/LastAccessWrite класса fileinfo, чтобы узнать, является ли оно актуальным, тогда вы знаете, что он используется.

Надеюсь, это поможет, С уважением, Tom.

+0

Время доступа - это всего лишь подсказка, что вы можете пропустить некоторые файлы, которые были бы удалены. – Guillaume

3

Советы: Если вы удаляете каталог, вы должны использовать Directory.Delete(String, Boolean).

Если вы работаете с FileInfo, звоните FileInfo.Delete(), это может быть или не быть быстрее. Ваша проблема, кажется, в вашей сети ...

+0

Скорее всего, это быстрее; он может пропустить поиск имени – MSalters