如何从WPF应用程序打开OneDrive文件

时间:2014-11-06 03:16:04

标签: c# .net wpf file-io onedrive

当我尝试从WPF应用程序打开OneDrive文件路径时,使用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文件还是实际打开WPF应用程序中的OneDrive文件?我认为这个文件只在网上提供的事实可能是个问题;有没有办法检测WPF或Windows桌面应用程序中的在线文件?

1 个答案:

答案 0 :(得分:0)

这个问题比较陈旧,所以这个答案主要针对那些通过搜索找到它的读者。

您可以判断文件是否是桌面应用中的在线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文件,但该文件的数据不是立即可用的,我认为这是您想知道的。