C# 以编程方式获取另一台计算机上共享文件夹的完整路径?

C# 以编程方式获取另一台计算机上共享文件夹的完整路径?,c#,networking,unc,network-drive,mapped-drive,C#,Networking,Unc,Network Drive,Mapped Drive,我知道您可以获取映射驱动器的路径(例如),但如果我唯一拥有的就是共享文件夹的路径,该怎么办 例如,假设我有一个朋友正在通过网络共享文件夹C:\MyDocs\PublicDoc。我可以通过路径\\danas pc\PublicDoc访问它。在另一台计算机上,是否有任何方法可以确定\\danas pc\PublicDoc实际映射到\\danas pc\c$\MyDocs\PublicDoc 我之所以这样问,是因为我得到了一个日志文件的路径,该日志文件具有该路径(例如\danas pc\c$\MyDo

我知道您可以获取映射驱动器的路径(例如),但如果我唯一拥有的就是共享文件夹的路径,该怎么办

例如,假设我有一个朋友正在通过网络共享文件夹
C:\MyDocs\PublicDoc
。我可以通过路径
\\danas pc\PublicDoc
访问它。在另一台计算机上,是否有任何方法可以确定
\\danas pc\PublicDoc
实际映射到
\\danas pc\c$\MyDocs\PublicDoc


我之所以这样问,是因为我得到了一个日志文件的路径,该日志文件具有该路径(例如
\danas pc\c$\MyDocs\PublicDoc\mylog.log
),我需要检查它是否与在其他位置设置的相同路径匹配。另一个位置具有“短路径”(例如,
\\danas pc\PublicDoc\mylog.log
),因此,即使日志路径指向相同的位置,程序也会确定它们是不同的。我想看看是否有办法确定它们指向同一个位置。

我无法想象为什么您可能需要它,因为远程实例的完整路径是\danas pc\PublicDoc,但如果您想像力旺盛,我建议如下:

(1) 在共享文件夹内的远程计算机上,您可以放置一个小脚本,如果执行该脚本,将返回完整路径。您必须搜索适用于windows或linux环境的适当编码,并且您需要对其具有执行权限。例如,在windows上,您可以在linux中使用vbscrit或cscript以及.sh脚本

另外,请注意,从远程主机查看,就远程主机而言,完整路径为\NAME-OR-IP\path\to\Folder\OR\File等。对于远程连接,完整路径为;)


更新: 根据下面的评论,这是一个完整的脚本,它执行以下操作

  • 创建一个vbscript,其中包含用于检索当前完整路径的代码
  • 将文件复制到所需的网络路径
  • 执行vbscript并读回结果
  • 删除vbscript
  • 假设:您具有对网络文件夹的读/写访问权限

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Net.Mime;
    using System.Runtime.CompilerServices;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace GetNetworkFullPath
    {
        class Program
        {
            static void Main(string[] args)
            {
                var networkFolder = "\\\\REMOTE-PC-NAME\\SharedFolder";
                var nameOfVBScript = "capturepath.vbs";
                var vbsOutput = "";
    
                //Get the name of the current directory
                var currentDirectory = Directory.GetCurrentDirectory();
                Console.WriteLine("Current Dir: " + currentDirectory);
    
    
                //1. CREATE A VBSCRIPT TO OUTPUT THE PATH WHERE IT IS PRESENT
                //Ref. https://stackoverflow.com/questions/2129327/how-to-get-the-fully-qualified-path-for-a-file-in-vbscript
                var vbscriptToExecute = "Dim folderName \n" +
                                            "folderName = \"\" \n" +
                                            "Dim fso \n" +
                                            "Set fso = CreateObject(\"Scripting.FileSystemObject\") \n" +
                                            "Dim fullpath \n" +
                                            "fullpath = fso.GetAbsolutePathName(folderName) \n" +
                                            "WScript.Echo fullpath \n";
    
    
                //Write that script into a file into the current directory
                System.IO.File.WriteAllText(@""+ nameOfVBScript  + "", vbscriptToExecute);
    
    
                //2. COPY THE CREATED SCRIPT INTO THE NETWORK PATH
                //Ref. https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-copy-delete-and-move-files-and-folders
                string sourceFile = System.IO.Path.Combine(currentDirectory, nameOfVBScript);
                string destFile = System.IO.Path.Combine(networkFolder, nameOfVBScript);
    
                System.IO.File.Copy(sourceFile, destFile, true);
    
                //3. EXECUTE THAT SCRIPT AND READ THE OUTPUT
                //Ref. https://stackoverflow.com/questions/27050195/how-do-i-get-the-output-from-my-vbscript-console-using-c
                Process scriptProc = new Process();
                ProcessStartInfo info = new ProcessStartInfo();
                info.WorkingDirectory = @"" + networkFolder + "";
                info.FileName = "Cscript.exe";
                info.Arguments = nameOfVBScript;
                info.RedirectStandardError = true;
                info.RedirectStandardInput = true;
                info.RedirectStandardOutput = true;
                info.UseShellExecute = false;
                info.WindowStyle = ProcessWindowStyle.Hidden;
                scriptProc.StartInfo = info;
                scriptProc.Start();
                scriptProc.WaitForExit();
                bool exit = false;
    
                while (!scriptProc.StandardOutput.EndOfStream)
                {
                    vbsOutput = scriptProc.StandardOutput.ReadLine();
                }
    
                Console.WriteLine("vbscript says: " + vbsOutput);
    
    
                //4. DELETE THE FILE YOU JUST COPIED THERE
                System.IO.File.Delete(@"" + networkFolder + "\\" + nameOfVBScript);
            }
        }
    }
    
    不幸的是,远程执行时,脚本会使用网络路径进行回复:(太失望了…真的很抱歉!只要执行是从远程系统之外的用户进行的,它就会用与该实例相关的绝对路径进行回复。我认为内部进程/用户应该执行该文件并用对应用程序的回复进行回复


    明天我会想得更多,如果幸运的话,也许会回复。

    你为什么要这样做?我想这应该会给你一个答案?我不明白你在问什么。或者你不明白。有很多UNC路径可以引用服务器上的同一个文件,包括通过预定义的
    $共享名称。是什么让这些成为“真实的”路径?如果有人将其服务器配置为禁用
    共享,该怎么办?请解决您的问题,以便清楚您在所有情况下实际期望发生的情况以及原因。您不太可能实现您的目标,但目前还不清楚该目标到底是什么。@PeterDuniho嗨,Peter,谢谢您富有洞察力的回答,我想id未意识到用户可以禁用共享或可能有许多UNC路径。我之所以这样做,是因为我得到了一个日志文件的路径,该路径具有该路径,我需要检查它是否与在另一个位置设置的相同路径匹配。另一个位置具有“短路径”,因此,尽管日志路径指向相同的东西,但程序确定它们是不同的,我想看看是否有办法确定它们指向相同的位置。@DanielMann我更新了我的问题,给出了原因:)你能举一个C#代码的小例子,它会在路径中编写这个文件,执行文件,捕获输出,然后删除文件吗?这个想法很好,但它会使答案更加完整。嗨,鲁弗斯,我根据你的评论编写了脚本,但不幸的是,它不适用于远程执行。我相信每次执行都是成功的远程打开路径被认为是这样的。主机上的内部进程应该执行脚本,并将结果发送回主应用程序供我们读取