2011-01-10 5 views
0

У меня есть фрагмент кода, который вызывает метод DeleteFile в классе Microsoft.VisualBasic.FileIO.FileSystem (в сборке Microsoft.VisualBasic) в чтобы отправить файл в Корзину вместо постоянного удаления. Этот код находится в управляемой службе Windows и работает на машине Win Server 2k8 (32-разрядная версия).Удалите файл в recyclebin в csharp с помощью метода FileSystem.DV.DeleteFile VB не работает должным образом

Соответствующая строка:

FileSystem.DeleteFile(file.FullName, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin, UICancelOption.DoNothing); 

Конечно, у меня есть "используя Microsoft.VisualBasic.FileIO;" в верхней части класса, и я проверил, что вызываемый метод действительно находится в классе FileSystem в этом пространстве имен. В приведенной выше строке я ссылаюсь на локальную переменную «файл» - это FileInfo для локального файла (скажем, C: \ path \ to \ file.txt), из которого я уверен, что он существует. Приложение имеет полный доступ как к файлу, так и к каталогу, в котором он находится.

Это похоже на то, что файл исчез из каталога, в котором он находился. Однако файл не отображается в корзине. Я попытался проверить папки C: \ $ Recycle.Bin вручную, так как я подозревал, что служба Windows, работающая в сеансе 0, заставит ее оказаться в другой корзине, но все корзины выглядят пустыми.

У кого-нибудь есть ключ к тому, что вызывает такое поведение?

Кстати, машина, конечно же, не находится в свободном пространстве на рассматриваемом диске (или любой другой диск, если на то пошло), а файл очень маленький (пара килобайт, поэтому он не превышает порог корзины).

+0

отправьте свой код. Я делал это в прошлом без проблем. – hunter

+0

Отредактировано сообщение, чтобы содержать соответствующую строку кода и еще несколько пояснений. – Mels

ответ

3

Предполагаю, что ваша служба работает под другой учетной записью пользователя, кроме вашей собственной (или одной из специальных учетных записей службы).

Я не считаю, что один пользователь может просматривать содержимое корзины другого пользователя - даже если вы можете увидеть некоторые доказательства их существования в папке C: \ $ Recycle.Bin.


Если он работает под другой учетной записью пользователя, попробуйте войти в систему с помощью этой учетной записи, а затем проверить корзины. Если он работает под учетной записью службы (например, Local Service, Network Service или Local System), это будет сложнее.

Учитывая, что корзины являются отдельными, как вы планируете использовать тот факт, что файл находится в корзине?

+0

Служба работает как локальная система. Я попробую, что произойдет, когда я изменю идентификатор процесса на учетную запись, в которую я могу войти в интерактивном режиме. – Mels

+0

Я не знал, что нет абсолютно никакого способа получить доступ к корзине другого пользователя. Я думаю, что на самом деле я это делал раньше, но может быть, я ошибаюсь или изоляция с тех пор стала сильнее. Я буду исследовать дальше. – Mels

+0

@Mels - я понимаю (из большого доверенного источника, который является wikipedia), что он изменился между 2000 и XP.Но это «цитата необходима». –

0

проблема может возникнуть у пользователя, выполняющего вашу службу, вы можете попробовать изменить исполняемую политику пользователя или изменить исполняющего пользователя.

В любом случае, это может также произойти из службы, выполняемой без оболочки, поскольку корзина зависит от оболочки api. this post, похоже, подтверждают эту проблему. Поэтому вам нужно будет использовать другой подход к acces shell api из вашей службы.