Похоже, что Vista не позволяет .net читать / обновлять атрибуты файлов - PullRequest
0 голосов
/ 03 июня 2010

Следующая функция копирует файл из Source & Path в Dest & Path, обычно устанавливая атрибуты файла в нормальное состояние перед копированием.

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

Sub CopyFile(ByVal Path As String, ByVal Source As String, ByVal Dest As String)
    If IO.File.Exists(Dest & Path) Then IO.File.SetAttributes(Dest & Path, IO.FileAttributes.Normal)
    IO.File.Copy(Source & Path, Dest & Path, True)

    If Handler.GetSetting(ConfigOptions.TimeOffset, "0") <> "0" Then
        IO.File.SetAttributes(Dest & Path, IO.FileAttributes.Normal)
        IO.File.SetLastWriteTimeUtc(Dest & Path, IO.File.GetLastWriteTimeUtc(Dest & Path).AddHours(Handler.GetSetting(ConfigOptions.TimeOffset, "0")))
    End If
    IO.File.SetAttributes(Dest & Path, IO.File.GetAttributes(Source & Path))
End Sub

Я просто не вижу проблемы в этом коде, поэтому после долгих часов поиска решения я подумал, что один из SO VB.Net Gurus может помочь:)

Большое спасибо.

Редактировать
Фактическая ошибка

Access to the path '(..)' is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize)
at System.IO.File.OpenFile(String path, FileAccess access, SafeFileHandle& handle)
at System.IO.File.SetLastWriteTimeUtc(String path, DateTime lastWriteTimeUtc)

1 Ответ

0 голосов
/ 04 июня 2010

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

альтернативный текст http://www.trendystock.com/images/Run%20as%20administrator%20for%20Vista%20PC.jpg


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

...