ما هو الخطأ في دعوة Winapi الخاصة بي للتعامل مع مسارات الملفات الطويلة؟

StackOverflow https://stackoverflow.com/questions/542720

  •  23-08-2019
  •  | 
  •  

سؤال

أحاول معرفة أفضل طريقة لنسخ الملفات في Windows باستخدام مسارات عميقة (الملفات، وليس المجلدات، لذا فإن Robocopy غير خارج السؤال). أفضل حل تمكنت من التوصل إليه هو كتابة الحل الخاص بي. لقد تمكنت من كتابة التعليمات البرمجية لمعالجة الدلائل الإدراجية بمسارات 10000 حرف، ولكن باستخدام نفس النهج لا يبدو أنه يعمل في نسخ الملفات فعليا. تعبت من استخدام مكتبات النظام. Prefixed إلى المسارات وهذا لم يبدو أنه يعمل.

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CopyFile(string lpExistingFileName, string lpNewFileName,
   bool bFailIfExists);

public static bool CopyFile(string source, string dest)
{
    source = fixPathForLong(source);
    dest = fixPathForLong(dest);

    return CopyFile(source, dest, false);
}

private static string fixPathForLong(String path)
{
    if (!path.StartsWith(@"\\?\"))
        path = @"\\?\" + path;
    return path;
}
هل كانت مفيدة؟

المحلول

إذا كانت المكالمة إلى CopyFile (وليس التحميل الزائد الخاص بك، فإن إعلان P / Invoke) إرجاع False وأود أن رمي Win32Exception:

public static void CopyFile(string source, string dest)
{
    source = fixPathForLong(source);
    dest = fixPathForLong(dest);

    if (!CopyFile(source, dest, false))
    {
        throw new Win32Exception();
    }
}

سيجعل المنشئ الافتراضي لفئة Win32Exception مكالمة إلى GetLastError وتعطيك معلومات خطأ أكثر تفصيلا حول سبب فشل العملية.

نصائح أخرى

يجب أن تسمي وظيفة copyfilew الوظيفة بدلا من ذلك؟ لاحظ ث في النهاية. أيضا، لا أعرف إذا كنت تستخدم مسارات UNC. إذا كان الأمر كذلك، فأنت بحاجة إلى بادئة مع "؟ UNC " بدلا من ذلك.

هذه مقالة جيدة لمعالجة المسار الطويل

http:/blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-part-1-/3-kim-hamilton.aspx.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top