代码之家  ›  专栏  ›  技术社区  ›  Dana

正在检查.net中的等效共享文件夹

  •  1
  • Dana  · 技术社区  · 16 年前

    在.net framework中,是否有方法检查两个不同的共享文件夹是否实际指向同一物理目录?Windows中的目录是否具有某种唯一标识符?谷歌fu让我失望了。

    (我的意思是,除了向其中一个写入临时文件并查看它是否出现在另一个文件中之外)

    编辑:我想我已经找到了我需要的东西,感谢布罗迪让我在System.Management命名空间中找到了正确的方向。

    4 回复  |  直到 16 年前
        1
  •  1
  •   Mark Brackett    16 年前

    如果不转到WMI,则非托管调用为 NetShareEnum 服务器名为NULL(本地计算机)且级别为502以获取 SHARE_INFO_502 结构。本地路径位于shi502_路径中。

    P/Invoke info 和往常一样,在pinvoke.net上已经结束了。

        2
  •  0
  •   Brody    16 年前

    您可以使用System.Management命名空间检查共享定义本身,但这并不容易使用。

    开始的时候有点像

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

    之后情况变得更糟了。我用它创建了一个共享。希望您可以使用它来确定每个共享的路径并进行比较。

        3
  •  0
  •   bruno conde    16 年前

    你必须采取不受管理的方法。我就是这样做的:

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

    干杯

        4
  •  0
  •   Dana    16 年前

    我相信使用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"]);
    }
    

    Path属性将给出共享的物理路径,我可以用它来比较这两个共享。