在Windows中获取OneDrive路径

20

我有一个C# WPF应用程序,现在想要找到一个在Windows中获取OneDrive根目录路径的方法。我该如何通过编程实现这个功能?我已经在网上搜索过,但是没有找到任何相关信息。我希望能够提供一些代码,但是我并不知道如何做到这一点;我的意思是,我已经检查了系统环境变量,并未发现有什么有效的解决方案,因此没有得到任何结果。

13个回答

34

在最新的Windows 10更新中,微软引入了一个新的环境变量%OneDrive%。我已经在2017年4月的更新(创作者更新)上进行了检查,它已经存在。


10
如果您的电脑上只有一个OneDrive客户端或者是默认的客户端,那么使用%OneDrive%。如果不是,则可使用%OneDriveConsumer%表示个人版OneDrive,%OneDriveCommercial%表示商业版OneDrive。请注意,不要改变原文意思。 - Jeankowkow

17

这对我有效(Windows 10专业版,1803):

 var oneDrivePath = Environment.GetEnvironmentVariable("OneDriveConsumer");

6
我使用常量FOLDERID_SkyDrive (https://msdn.microsoft.com/library/dd378457.aspx)和从这个答案中获取的“GetKnownFolderPath”方法来获取我的OneDrive文件夹的位置// 检测AppData\LocalLow的位置
虽然环境变量"USERPROFILE"结合"\OneDrive"有时会起作用,但如果用户移动了他们的OneDrive文件夹,环境变量实际上将是一个重解析点,而不是实际位置。
在Windows 10上测试。
Guid FOLDERID_SkyDrive = new Guid("A52BBA46-E9E1-435f-B3D9-28DAA648C0F6");
location = GetKnownFolderPath(FOLDERID_SkyDrive);

C# 如果我理解正确的话,这意味着它是“自动”管理的代码。我的完整方法: [code] public static string GetOneDriveLocation() { var userPath = Environment.GetEnvironmentVariable("USERPROFILE"); var di = new DirectoryInfo(System.IO.Path.Combine(userPath, "OneDrive")); var location = di.FullName; if (di.Attributes.HasFlag(FileAttributes.ReparsePoint)) { Guid FOLDERID_SkyDrive = new Guid("A52BBA46-E9E1-435f-B3D9-28DAA648C0F6"); location = GetKnownFolderPath(FOLDERID_SkyDrive); } return location; }[/code] - tabletguy

6
在我使用 Windows 8.1 计算机上,保存此信息的注册表键是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\SkyDrive\UserFolder 我会尝试使用Registry.GetValue()方法:
        const string userRoot = "HKEY_CURRENT_USER";
        const string subkey = @"Software\Microsoft\Windows\CurrentVersion\SkyDrive";
        const string keyName = userRoot + "\\" + subkey;

        string oneDrivePath = (string)Registry.GetValue(keyName,
        "UserFolder",
        "Return this default if NoSuchName does not exist.");
        Console.WriteLine("\r\n OneDrivePath : {0}", oneDrivePath);

我还在下面找到了路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager\SkyDrive\UserSyncRoots\S-1-5-21-2696997101-1021499815-432504798-1004
HKEY_USERS\S-1-5-21-2696997101-1021499815-432504798-1004\Software\Microsoft\Windows\CurrentVersion\SkyDrive\UserFolder

我不建议您最后两条路径,还需要获取用户SID。如果当前用户在该位置看到了该SID,则最后一条路径在技术上是第一条路径。 - Ray
6
当前OneDrive位置为 HKEY_CURRENT_USER\Software\Microsoft\OneDrive,其值为 UserFolder - Alex Zhukovskiy
有人知道如何在Mac OS X上做这件事吗? - Ferdinand Rios

4
为了完整起见,似乎设置了3个环境变量: OneDrive OneDriveConsumer OneDriveCommercial 在我的情况下,第一个和最后一个是相同的(我的商业版OneDrive帐户),中间一个是我的个人版OneDrive。我在加入域的计算机和没有加入域的计算机上看到了相同的结果,但两者都配置了OneDrive。在只有我的个人版OneDrive的未加入域的PC上,OneDrive环境变量指向个人版OneDrive。
我找不到任何微软文档来说明这一点,但我认为最好忽略OneDrive变量,只使用OneDriveConsumer/OneDriveCommercial来查找OneDrive文件夹。
Steve

2
如果您正在使用PowerShell,可以使用以下命令:

$ENV:onedrive


在史蒂夫·罗奇福德的输入下,将$ENV:OneDriveConsumer翻译成中文。 - Rocky Scott

1
    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
             const string userRoot = "HKEY_CURRENT_USER";
             const string subkey = @"Software\Microsoft\OneDrive";
             const string keyName = userRoot + "\\" + subkey;

             string oneDrivePath = (string)Microsoft.Win32.Registry.GetValue(keyName,
                "UserFolder",
               "Return this default if NoSuchName does not exist.");
             Console.WriteLine("\r\n OneDrivePath : {0}", oneDrivePath);

            string Onedrivepath= string.Format(oneDrivePath);
             label1 .Text = string.Format(Onedrivepath);

        }
        catch (Exception)
        {
            /// throw;
        }
    }

1
欢迎来到SO!您能否提供更多关于您发布的代码的信息和解释? - fstanis

1

为了跟踪这些OneDrive环境变量(它将显示以“one”开头的所有环境变量):

从CMD:

$>set one
OneDrive=C:\Users\my_username\OneDrive - COMPANY
OneDriveCommercial=C:\Users\my_username\OneDrive - COMPANY
OneDriveConsumer=C:\Users\my_username\OneDrive

来自PowerShell:

$>dir env: | Where-Object {$_.Name -like "one*"}
OneDrive=C:\Users\my_username\OneDrive - COMPANY
OneDriveCommercial=C:\Users\my_username\OneDrive - COMPANY
OneDriveConsumer=C:\Users\my_username\OneDrive

或者

$>Get-ChildItem env: | Where-Object {$_.Name -like "one*"}
OneDrive=C:\Users\my_username\OneDrive - COMPANY
OneDriveCommercial=C:\Users\my_username\OneDrive - COMPANY
OneDriveConsumer=C:\Users\my_username\OneDrive

0

在VBA中使用Environ("OneDriveConsumer")


0

我认为注册表是Smashing1978提到的,但是在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\SkyDrive下我没有UserFolder键。

你能使用%UserProfile%\SkyDrive路径吗?


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager\SkyDrive\UserSyncRoots\是什么情况? - Alexandru
1
我在注册表中有一个条目,位于键“S-1-5-21-3897053772-1539939438-3998215170-1142”下。 - jasonnissen
1
这是您当前用户配置文件的安全标识符。我认为这是目前已知的唯一检测OneDrive路径的方法。 - Alexandru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接