سؤال

هل هناك طريقة، في إطار الصافية، لتحقق لمعرفة ما إذا كان اثنين من المجلدات المشتركة مختلفة تشير في الواقع إلى نفس الدليل المادي؟ هل الدلائل في ويندوز يكون نوعا من معرف فريد؟ جوجل فو فشل لي.

و(أعني، جانبا من الكتابة ملف مؤقت إلى واحد ورؤية إذا كان يبدو في الآخر)

وتحرير: أعتقد انني اكتشفت ما أحتاج، مع الشكر لبرودي للحصول على لي أشار في الاتجاه الصحيح في مساحة الاسم System.Management

.
هل كانت مفيدة؟

المحلول 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، والدعوة غير المدارة هو <وأ href = "http://msdn.microsoft.com/en-us/library/bb525387(VS.85).aspx" يختلط = "نوفولو noreferrer "> NetShareEnum مع SERVERNAME من NULL (الكمبيوتر المحلي)، ومستوى 502 للحصول على <لأ href =" http://msdn.microsoft.com/en-us/library/bb525410(VS.85 ) .aspx اتصال "يختلط =" نوفولو noreferrer "> SHARE_INFO_502 البنية. المسار المحلي في shi502_path.

P / استدعاء المعلومات ، كما هو الحال دائما، هو في أكثر من pinvoke.net.

يمكنك فحص تعريف حصة نفسه باستخدام System.Management مساحة الاسم ولكنها ليست سهلة الاستخدام.

ويبدأ شيء من هذا القبيل

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

وتزداد الأمور سوءا بكثير بعد ذلك. لقد استخدمت لإنشاء مشاركة. نأمل أن يمكن استخدامه لمسار كل سهم والمقارنة.

وأعتقد أن صافي الإطار لا يوفر ما تحتاجه من معلومات لمقارنة 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