문제

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

(내 말은, 임시 파일을 하나에 쓰고 다른 사람에게 나타나는지 보는 것 외에는)

편집 : 시스템에서 올바른 방향을 가리킨 Brody 덕분에 필요한 것을 발견했다고 생각합니다. 관리 네임 스페이스.

도움이 되었습니까?

해결책 4

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"]);
}

그리고 경로 속성은 나에게 두 주식을 비교하는 데 사용할 수있는 주식의 물리적 경로를 줄 것입니다.

다른 팁

WMI를 가지 않으면 관리되지 않는 전화는 NETSHAREENUM NULL (로컬 컴퓨터)의 서버 이름과 502 레벨이 share_info_502 구조. 로컬 경로는 Shi502_Path에 있습니다.

P/정보 호출, 항상 그렇듯이 Pinvoke.net에서 끝났습니다.

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

그것은 같은 것을 시작합니다

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

그리고 그 후에는 훨씬 악화됩니다. 나는 그것을 공유를 만들기 위해 사용했습니다. 바라건대 각 공유 및 비교의 경로에 사용할 수 있기를 바랍니다.

.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));
    }
}

효과가있다! 도움이 되었기를 바랍니다.

건배.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top