Когда я пытаюсь открыть пути к файлу OneDrive из приложения WPF, я получаю следующую ошибку при использовании File.ReadAllText(filename);
:
The file cannot be accessed by the system.
Несмотря на то, что вы явно проверяете разрешения на чтение:
private static bool HasReadPermissions(string filename)
{
FileSystemSecurity security = File.GetAccessControl(filename);
var rules = security.GetAccessRules(true, true, typeof(NTAccount));
var currentUser = new WindowsPrincipal(WindowsIdentity.GetCurrent());
foreach (FileSystemAccessRule rule in rules)
{
if (!currentUser.IsInRole(rule.IdentityReference.Value) || (rule.FileSystemRights & (FileSystemRights.ReadData | FileSystemRights.Read)) == 0)
{
continue;
}
if (rule.AccessControlType == AccessControlType.Deny)
{
return false;
}
if (rule.AccessControlType == AccessControlType.Allow)
{
return true;
}
}
return false;
}
Есть ли способ проверить разрешения OneDrive или определить, является ли файл файлом OneDrive или фактически открывать файлы OneDrive в приложении WPF? Я думаю, что проблема в том, что этот файл доступен онлайн - только может быть проблема; есть ли способ обнаруживать только онлайн файлы в WPF или настольных приложениях Windows?
Этот вопрос относительно старый, поэтому этот ответ в основном предназначен для читателей, которые находят его путем поиска.
Вы можете определить, является ли файл файлом OneDrive только для онлайн-приложений. Просто проверьте атрибуты файла, и если подключен автономный атрибут, файл будет только однопользовательским файлом OneDrive. Ниже приведен пример метода:
public static bool IsFileAvailable(string filePath)
{
if (!File.Exists(filePath))
return false;
var attributes = File.GetAttributes(filePath);
Debug.WriteLine(attributes);
// Available online-only: Hidden, System, Archive, SparseFile, ReparsePoint, Offline
// Available offline: Archive
return !attributes.HasFlag(FileAttributes.Offline);
}
Автономный атрибут напрямую не указывает на то, что файл является файлом OneDrive в режиме онлайн, но данные файла не доступны сразу, и я думаю, что это то, что вы хотите знать.