【问题标题】:File path when working with One Drive for Buisiness使用 Onedrive for Business 时的文件路径
【发布时间】:2017-02-28 22:53:30
【问题描述】:

我有一个 MS Word 加载项,它适用于 One Drive for Business 本地同步区域中的文件。

我在 C:..\OneDrive..\MyDir\File.docx 创建文件 稍后我创建了一个 FileInfo 对象:

var file = new FileInfo(doc.FullName);

当我调试时这工作正常。但是,当我正常运行代码时, doc.FullName 是网络路径https://..-my.sharepoint.com/personal/../MyDir/File.docx 这会破坏 FileInfo 对象。

为什么 MS Word 会返回 uri 而不是本地文件路径? 为什么在调试我的加载项时 MS Word 不一致? 以及关于我是否可以围绕这个编码的任何想法?

-- 编辑--

共有三种行为:

  1. 运行 Winword.exe (doc.FullName = http://[OneDrive])

  2. 运行 Winword.exe 并附加到 Visual Studio 中的进程 (doc.FullName = http://[OneDrive])

  3. 在 Visual Sudio 中按 F5 进行调试(doc.FullName = C:..\OneDrive..)

【问题讨论】:

  • 您是否尝试过运行应用程序 \ exe,然后将 Visual Studio 附加到该进程以查看它从何处获取内容,然后以这种方式对其进行调试?
  • 有趣.. 当我将调试器附加到 Winword.exe 时,doc.FullName 是 web 路径 http://(将更新上面的帖子)。我想知道为什么Visual Studio通过F5启动Winword.exe时会有所不同??
  • 从VS运行时文件的完整路径是什么?
  • 我的 One Drive 文件夹的本地路径 - C:\Users\\OneDrive - \MyDir\
  • 这就是你通过VS调试时看到的吗?

标签: c# ms-word onedrive


【解决方案1】:

Word 可以打开本地文件和云文件。当安装了最新的 OneDrive 同步客户端并打开同步到云的本地文件时,Word 将发现其云 URL 并更喜欢使用它,因为它会启动基于云的功能,例如共同创作。如果可以调整您的插件以支持没有本地副本的纯云文件,那么该解决方案可能也适用于 OneDrive 同步文件。

【讨论】:

  • 我与 Office PG 就这个问题进行了很多讨论,因为这不是人们所期望的。如果您在 Word(桌面)中手动转到文件 - 打开文件位置,您会看到同样的情况。这将打开“在线”文档位置而不是本地文件位置。桌面用户希望改为转到本地位置。
  • 这里有什么消息吗?我面临同样的问题。是否无法获取正确的本地文件夹而不是获取远程同步的文件夹?没有财产,没有其他可能以某种方式获得这个值?
【解决方案2】:

我在这个链接上找到了答案:

https://social.msdn.microsoft.com/Forums/en-US/1331519b-1dd1-4aa0-8f4f-0453e1647f57/how-to-get-physical-path-instead-of-url-onedrive?forum=officegeneral

        private string GetFileLocalPath(string rawPath)
        {
            try
            {
                var workbookUri = new Uri(rawPath);
                // If local file, return it as-is
                if (workbookUri.IsFile)
                    return rawPath;

                string localPath = string.Empty;
                // Registry key names to loop                
                List<string> keyNames = new List<string>() { "OneDriveCommercial", "OneDrive", "onedrive" };
                foreach (var keyName in keyNames)
                {
                    using (var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Environment", false))
                    {
                        var rootDirectory = key.GetValue(keyName).ToString();
                        if (string.IsNullOrEmpty(rootDirectory) == false && System.IO.Directory.Exists(rootDirectory))
                        {
                            var pathParts = new Queue<string>(workbookUri.LocalPath.Split('/'));
                            do
                            {
                                // Compose a local path by adding root directory and slashes in between                                
                                string subPath = string.Join("\\", pathParts);
                                localPath = string.Format("{0}{1}", rootDirectory, subPath);

                                if (System.IO.File.Exists(localPath))
                                    return localPath;

                                // The file was not found - get rid of leftmost part of the path and try again
                                pathParts.Dequeue();
                            }
                            while (pathParts?.Count() > 0);

                        }
                    }
                }
                return localPath;
            }
            catch (Exception ex)
            {

                return rawPath;
            }

        }

【讨论】:

  • 让我对自己的答案提出警告:它不适用于共享点站点(最终在一个驱动器中)。要重现:转到共享点库并单击“同步”。这将在 Windows 资源管理器中创建一个新的“一个驱动器”文件夹。如果从该位置打开文档,则上面的代码不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
相关资源
最近更新 更多