Удалить файл в корзину в csharp с помощью метода VB FileSystem.DeleteFile, который не работает должным образом

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

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

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, приведет к тому, что она окажется в другой корзине, но все корзины выглядят пустыми.

Кто-нибудь знает, что вызывает такое поведение?

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


person Mels    schedule 10.01.2011    source источник
comment
пожалуйста, опубликуйте свой код. Я делал это в прошлом без проблем.   -  person hunter    schedule 10.01.2011
comment
Отредактированный пост, содержащий соответствующую строку кода и некоторые дополнительные пояснения.   -  person Mels    schedule 10.01.2011


Ответы (2)


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

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


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

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

person Damien_The_Unbeliever    schedule 10.01.2011
comment
Служба работает как локальная система. Я попробую, что произойдет, когда я изменю идентификатор процесса на учетную запись, в которую я могу войти в интерактивном режиме. - person Mels; 10.01.2011
comment
Я не знал, что нет абсолютно никакого способа получить доступ к корзине другого пользователя. Я думаю, что я действительно сделал это однажды в прошлом, но может быть, я ошибаюсь или изоляция с тех пор стала сильнее. Я буду исследовать дальше. - person Mels; 10.01.2011
comment
@Mels - я понимаю (из надежного источника, которым является Википедия), что он изменился между 2000 и XP. Но это цитата нужна. - person Damien_The_Unbeliever; 10.01.2011
comment
Только что попробовал запустить сервис под новой учетной записью с соответствующими правами. Тот же результат: файл пропал, но не появляется ни в одной корзине. Похоже, что службы просто не могут каким-то образом отправлять файлы в корзину. Думаю, я просто перемещу файлы в настраиваемую папку корзины, а не удалю их, если у кого-нибудь нет лучших идей? - person Mels; 10.01.2011
comment
@Mels - это было бы разумно, если вы ожидаете, что другие смогут получить эти файлы. - person Damien_The_Unbeliever; 10.01.2011
comment
Я думаю, что API-интерфейс оболочки требует, чтобы интерактивный сеанс работал правильно, особенно для запросов к специальным папкам, что в этом случае имеет решающее значение. - person dvhh; 10.01.2011

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

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

person dvhh    schedule 10.01.2011