هو إعادة تسمية ملف الذرية (مع الكتابة) المحتملة على ويندوز؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

في أنظمة POSIX تسمية (2) ينص على عملية إعادة تسمية الذرية، بما في ذلك الكتابة فوق الملف الوجهة إذا كان موجودا، وإذا تسمح الأذونات.

هل هناك أي طريقة للحصول على نفس دلالات على ويندوز؟ أعرف عن MoveFileTransacted () على ويندوز فيستا وسيرفر 2008، ولكن انا بحاجة الى هذا لدعم WIN2K وما فوق.

والكلمة المفتاح هنا هو <م> الذري ... يجب أن الحل لن يكون قادرا على تفشل بأي حال من الأحوال أن يترك العملية في حالة غير متناسقة.

ولقد رأيت الكثير من الناس يقولون هذا من المستحيل على Win32، لكني أسألك، هل هو حقا؟

يرجى توفير الاستشهادات يمكن الاعتماد عليها إذا أمكن ذلك.

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

المحلول

وWin32 ولا يضمن عمليات البيانات الفوقية الملف النووي. فما استقاموا لكم فاستقيموا توفير الاقتباس، ولكن ليس هناك شيء - تلك الحقيقة أنه لا يوجد ضمانات كتابية أو موثقة يعني بقدر

وأنت ستكون لدينا لكتابة الروتينية الخاصة بك لدعم هذا. من المؤسف، ولكن لا يمكن أن نتوقع Win32 لتوفير هذا المستوى من الخدمة - أنها ببساطة لم تكن مصممة لذلك

نصائح أخرى

وانظر ReplaceFile() في Win32 ( http://research.microsoft.com /pubs/64525/tr-2006-45.pdf )

في ويندوز Vista و Windows Server 2008 تمت إضافة وظيفة الخطوة الذرية - MoveFileTransacted ()

للأسف هذا لا يساعد مع الإصدارات القديمة من ويندوز.

مثيرة للاهتمام هنا على MSDN .

لا يزال لديك تسمية () ندعو ويندوز، على الرغم من أنني أتصور الضمانات، التي تريدونها لا يمكن أن يتم دون معرفة نظام الملفات الذي تستخدمه - لا ضمانات إذا كنت تستخدم FAT على سبيل المثال

ومع ذلك، يمكنك استخدام MoveFileEx واستخدام MOVEFILE_REPLACE_EXISTING  والخيارات MOVEFILE_WRITE_THROUGH. وهذا الأخير له هذا الوصف في MSDN:

<اقتباس فقرة>   

وإعداد هذه الضمانات القيمة التي   تحرك يقوم كنسخة وحذف   يتم مسح التشغيل إلى القرص قبل   ترجع الدالة. يحدث الاحمرار   في نهاية عملية النسخ.

وأنا أعلم أن هذا ليس بالضرورة نفس عملية إعادة تسمية، ولكن أعتقد أنه قد يكون أفضل ضمان ستحصل - إذا كان يفعل ذلك للتحرك الملف، فإنه ينبغي لإعادة تسمية أبسط.

وبدء التشغيل مع Windows 10 1607، NTFS لا تدعم عملية تحل محلها تسمية ذرية. للقيام بذلك استدعاء NtSetInformationFile (...، FileRenameInformationEx، ...) وتحديد العلامة FILE_RENAME_POSIX_SEMANTICS. أو مكافئ في Win32 دعوة SetFileInformationByHandle (...، FileRenameInfoEx، ...) وتحديد العلامة FILE_RENAME_FLAG_POSIX_SEMANTICS.

وهناك عدد لا بأس به من إجابات ولكن ليست واحدة كنت أتوقع ... وكان لي فهم (ربما بشكل غير صحيح) أن MoveFile <م> يمكن أن تكون الذري شريطة أن النجوم المناسبة الانحياز، استخدمت الأعلام، و كان نظام الملفات نفسه على مصدر هدفا. وإلا، فإن عملية يتراجع إلى [Copy-> حذف] ملف.

وبالنظر إلى أن، وكان لي أيضا أن يكون مفهوما أن MoveFile - عندما يكون الذري - كان مجرد وضع ملف المعلومات والتي أيضا يمكن القيام به هنا: <لأ href = "http://msdn.microsoft.com/en-us/library/ النوافذ / المكتبي / aa365539 (ت = vs.85) .ASPX "يختلط =" نوفولو noreferrer "> setfileinfobyhandle .

وأعطى أحدهم حديث يسمى "<لأ href =" https://github.com/CppCon/CppCon2015/blob/master/Tutorials/Racing٪20the٪20Filesystem/Racing٪20the٪20Filesystem٪20-٪20Niall٪20Douglas ٪ 20-٪ 20CppCon٪ 202015.pdf "يختلط =" نوفولو noreferrer "> سباق نظام الملفات " الذي يذهب إلى بعض أكثر عمقا حول هذا الموضوع. (حوالي 2 / 3rds أسفل يتحدثون عن إعادة تسمية الذرية)

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