2017-11-03 34 views
2

매핑 된 드라이브 (예 : Find UNC path of a network drive?)의 경로를 얻을 수 있다는 것을 알고 있지만 공유 폴더에 대한 경로 만 있으면 어떻게 될까요?다른 컴퓨터에서 공유 폴더의 전체 경로를 프로그래밍 방식으로 얻으시겠습니까?

예를 들어 네트워크를 통해 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)를 가지며 따라서 로그 경로가 동일한 위치로 연결 되더라도 프로그램은 서로 다른 경로로 판단합니다. 나는 그들이 같은 위치를 가리키고있는 것을 알 수있는 방법이 있는지 알고 싶다.

+0

왜 하시겠습니까? –

+0

그 대답을 주어야겠습니까? https://superuser.com/questions/1146811/getting-real-path-of-file-on-samba-server-from-client – mariozski

+0

나는 당신이 무엇을 요구하고 있는지 이해하지 못합니다. 아니면 그렇지 않을 수도 있습니다.미리 정의 된' $ '공유 이름을 통과하는 파일을 포함하여 서버의 동일한 파일을 참조 할 수있는 UNC 경로가 여러 개 있습니다. 그 중 "진짜"경로를 만드는 것은 무엇입니까? ''공유를 사용하지 못하도록 서버를 설정하면 어떨까요? 질문을 수정하여 모든 경우에 실제로 일어날 것으로 기대되는 이유와 이유를 분명히하십시오. 목표를 달성 할 가능성은 낮지 만 현재 목표가 실제로 무엇인지는 분명하지 않습니다. –

답변

3

원격 인스턴스의 전체 경로에 대한 때문에이 필요한 이유를 나는 상상할 수 없다는 \ danas-PC의 \의 PublicDoc입니다하지만 당신은 당신의 상상을 할 수 있다면 이런 식으로 뭔가를 건의 할 것 번창 :

(1) 공유 폴더 내의 원격 컴퓨터에서 작은 스크립트를 삭제할 수 있습니다. 실행되는 경우 전체 경로를 반환합니다. 당신은 Windows 또는 리눅스 환경에 대한 적절한 코딩을 검색해야하며 실행 권한이나 권리가 필요합니다. 예를 들어 Windows에서 vbscrit 또는 cscript와 Linux에서 .sh 스크립트를 가질 수 있습니다.

또한 원격 호스트의 관점에서 볼 때 전체 경로는 \ NAME-OR-IP \ Path \에서 \ Folder \ 또는 \ File입니다. 원격 연결의 경우 전체 경로입니다)


UPDATE : 아래의 코멘트에 따라 는,이 다음

  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://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); 
     } 
    } 
} 

불행하게도 때 네트워크 폴더에 대한 읽기/쓰기 권한이 원격으로 실행 된 스크립트는 네트워크 경로로 응답합니다. (너무 실망했습니다 ... 정말로 미안 해요! 원격 시스템 외부의 사용자로부터 실행이 일어나기 만하면 해당 인스턴스와 관련된 절대 경로로 응답합니다. 내부 프로세스/사용자가 파일을 실행하고 응용 프로그램에 대한 응답으로 회신해야한다고 생각합니다.

enter image description here

뭔가 더 내일을 생각하려고 내가 운이있어 경우에 어쩌면 다시 답변 해 드리겠습니다.

+0

경로에이 파일을 작성하고 파일을 실행하고 출력을 캡처하고 파일을 삭제하는 작은 예제 C# 코드를 표시 할 수 있습니까? 아이디어는 훌륭하지만 대답이 훨씬 더 완벽 해집니다. –

+0

안녕하세요 루퍼스, 귀하의 의견에 따라 스크립트를했으나 불행히도 원격 실행에서는 작동하지 않았습니다. 실행이 원격으로 진행될 때마다 그 경로가 그렇게 간주됩니다. 호스트 시스템의 내부 프로세스는 스크립트를 실행하고 우리가 읽을 수 있도록 메인 애플리케이션으로 결과를 보내야합니다 – oetoni