在程序中如何获取另一台计算机上共享文件夹的完整路径?

3
我知道你可以获取映射驱动器的路径(例如查找网络驱动器的UNC路径?),但如果我只有共享文件夹的路径呢?
例如,假设我的朋友正在共享文件夹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),因此,即使日志路径导致相同的位置,程序仍然确定它们是不同的。我想看看是否有办法弄清楚它们指向同一位置。

你为什么想要这样做? - Daniel Mann
我想这应该会给你一个答案吧?https://superuser.com/questions/1146811/getting-real-path-of-file-on-samba-server-from-client - mariozski
我不明白你在问什么。或者也许你自己都不清楚。有很多个 UNC 路径可以引用同一台服务器上的文件,包括通过预定义的 <drive-letter>$ 共享名称的路径。什么使其中任何一个成为“真实”路径?如果有人配置他们的服务器禁用了 <drive-letter$> 共享,那该怎么办?请修正你的问题,以便在所有情况下都清楚地说明你实际期望发生的事情以及原因。你很可能无法实现你的目标,但目前还不清楚这个目标究竟是什么。 - Peter Duniho
@PeterDuniho 你好,感谢你的见解性回复。我之前并没有意识到用户可以禁用共享或者有多个 UNC 路径。 我提出这个问题是因为我被给了一个路径指向日志文件,它有 <drive-letter$> 路径,我需要检查它是否与另一个位置设置的相同路径匹配。另一个位置具有“短路径”,因此,即使日志路径导致相同的内容,程序仍然认为它们不同。我想知道是否有一种方法可以确定它们指向同一位置。 - SaiyanGirl
@DanielMann 我更新了我的问题并提供了原因 :) - SaiyanGirl
1个回答

5
我无法想象为什么你需要这个,因为远程实例的完整路径是\danas-pc\PublicDoc,但如果你让想象力发挥,我建议像这样做:
(1)在共享文件夹内部的远程计算机上,您可以放置一个小脚本,如果执行返回完整路径。您必须搜索适用于Windows或Linux环境的适当编码,同时还需要具有执行特权或权限。例如,在Windows上,您可以使用VBScript或CScript,在Linux上可以使用.sh脚本。
此外,请注意,从远程主机的角度来看,在远程主机方面,完整路径是\NAME-OR-IP\Path\to\Folder\or\File等。对于您在远程连接上,那就是完整路径;)

更新:

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

  1. 创建一个包含代码的VBScript来检索当前完整路径
  2. 将文件复制到网络所需路径
  3. 执行VBScript并读取结果
  4. 删除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://dev59.com/Q3I95IYBdhLWcg3w1Bvo
            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://learn.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);
        }
    }
}

很遗憾,当脚本在远程执行时,它会回复网络路径 :( 我感到非常失望...真的很抱歉!只要执行来自远程系统外的用户,它就会回复与该实例相关的绝对路径。我认为内部进程/用户应该执行文件并回复应用程序的答案。

enter image description here

明天我会再想一些东西,如果我运气好的话,可能会回复。


你能展示一小段C#代码的例子吗?它可以在指定路径写入文件,执行该文件,捕获输出并删除该文件。这个想法很好,但是加上代码会让答案更加完整。 - Rufus L
嗨Rufus,我按照你的评论编写了脚本,但不幸的是它在远程执行时无法工作。我相信每次远程执行时路径都会被视为这样。主机机器上的内部进程应该执行脚本并将结果发送回主应用程序供我们读取。 - oetoni

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