2008-11-04 2 views
1

두 개의 다른 공유 폴더가 실제로 동일한 실제 디렉토리를 가리키는 지 확인하려면 .net 프레임 워크에서 방법이 있습니까? Windows의 디렉토리에는 일종의 고유 한 식별자가 있습니까? Google-fu는 실패하고 있습니다..net의 동등한 공유 폴더 확인

편집을 (다른 나타나는 경우 내가 하나에 임시 파일을 작성하고보고 제외하고, 평균) : 나는 내가 나에 지적 얻기를위한 브로디 덕분에, 필요한 것을 발견했습니다 생각 System.Management 네임 스페이스의 올바른 방향.

+0

공유 폴더 란 무엇입니까? 네트워크 공유? –

답변

0

나는 내가해야 할 일을 알아서 할 것이다 WMI 쿼리를 사용 믿습니다

Connection options = new ConnectionOptions(); 
ManagementScope scpoe = new ManagementScope("\\\\Server\\root\\cimv2", options); 
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Share WHERE Name = '" + name +"'") 

ManagementObjectSearcher searcher = new ManagementObjectSearch(scope, query); 
ManagementObjectCollection qc = searcher.Get(); 

foreach (ManagementObject m in qc) { 
    Console.WriteLine(m["Path"]); 
} 

그리고 경로 속성은 나에게 내가 이주을 비교하는 데 사용할 수있는 공유의 물리적 경로를 제공 할 것입니다.

0

System.Management 네임 스페이스를 사용하여 공유 정의 자체를 검토 할 수 있지만 사용하기 쉽지 않습니다.

ManagementClass management = new ManagementClass("\\\\.\\root\\cimv2", "Win32_Share", null) 

뭔가를 시작 그리고 그 이후 더 악화된다. 나는 그것을 공유를 만드는 데 사용했다. 다행히도 각 공유에 대한 경로를 사용하여 비교할 수 있습니다.

0

.NET 프레임 워크가 2 개의 디렉토리를 비교하는 데 필요한 정보를 제공하지 않는다고 생각합니다. 관리되지 않는 접근 방식을 취해야합니다. 이것이 내가 한 방법입니다.

class Program 
{ 
    struct BY_HANDLE_FILE_INFORMATION 
    { 
     public uint FileAttributes; 
     public System.Runtime.InteropServices.ComTypes.FILETIME CreationTime; 
     public System.Runtime.InteropServices.ComTypes.FILETIME LastAccessTime; 
     public System.Runtime.InteropServices.ComTypes.FILETIME LastWriteTime; 
     public uint VolumeSerialNumber; 
     public uint FileSizeHigh; 
     public uint FileSizeLow; 
     public uint NumberOfLinks; 
     public uint FileIndexHigh; 
     public uint FileIndexLow; 
    } 

    // 
    // CreateFile constants 
    // 
    const uint FILE_SHARE_READ = 0x00000001; 
    const uint FILE_SHARE_WRITE = 0x00000002; 
    const uint FILE_SHARE_DELETE = 0x00000004; 
    const uint OPEN_EXISTING = 3; 

    const uint GENERIC_READ = (0x80000000); 
    const uint GENERIC_WRITE = (0x40000000); 

    const uint FILE_FLAG_NO_BUFFERING = 0x20000000; 
    const uint FILE_READ_ATTRIBUTES = (0x0080); 
    const uint FILE_WRITE_ATTRIBUTES = 0x0100; 
    const uint ERROR_INSUFFICIENT_BUFFER = 122; 
    const uint FILE_FLAG_BACKUP_SEMANTICS = 0x02000000; 


    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern IntPtr CreateFile(
     string lpFileName, 
     uint dwDesiredAccess, 
     uint dwShareMode, 
     IntPtr lpSecurityAttributes, 
     uint dwCreationDisposition, 
     uint dwFlagsAndAttributes, 
     IntPtr hTemplateFile); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern bool GetFileInformationByHandle(IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation); 

    static void Main(string[] args) 
    { 
     string dir1 = @"C:\MyTestDir"; 
     string dir2 = @"\\myMachine\MyTestDir"; 
     Console.WriteLine(CompareDirectories(dir1, dir2)); 
    } 

    static bool CompareDirectories(string dir1, string dir2) 
    { 
     BY_HANDLE_FILE_INFORMATION fileInfo1, fileInfo2; 
     IntPtr ptr1 = CreateFile(dir1, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero); 
     if ((int)ptr1 == -1) 
     { 
      System.ComponentModel.Win32Exception t = new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); 
      Console.WriteLine(dir1 + ": " + t.Message); 
      return false; 
     } 
     IntPtr ptr2 = CreateFile(dir2, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, IntPtr.Zero); 
     if ((int)ptr2 == -1) 
     { 
      System.ComponentModel.Win32Exception t = new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); 
      Console.WriteLine(dir2 + ": " + t.Message); 
      return false; 
     } 
     GetFileInformationByHandle(ptr1, out fileInfo1); 
     GetFileInformationByHandle(ptr2, out fileInfo2); 

     return ((fileInfo1.FileIndexHigh == fileInfo2.FileIndexHigh) && 
      (fileInfo1.FileIndexLow == fileInfo2.FileIndexLow)); 
    } 
} 

작동합니다! 희망이 도움이됩니다.

건배.

1

WMI로 이동하지 않는 경우 관리되지 않는 호출은 이고 서버 이름은 NULL (로컬 컴퓨터)이고 502 수준은 SHARE_INFO_502 구조체입니다. 로컬 경로는 shi502_path에 있습니다.

P/Invoke info은 항상 pinvoke.net에서 끝났습니다.

관련 문제