في Windows ، هل يجب أن أستخدم CreateFile أو Fopen ، قابلية النقل جانباً؟

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

سؤال

ما هي الاختلافات ، وفي الحالات التي سيثبتها أحدهم أو آخر متفوقة بطريقة ما؟

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

المحلول

أولا وقبل كل شيء الوظيفة fopen يمكن استخدامها فقط للعمليات المحمولة البسيطة مع الملفات.

CreateFile على الجانب الآخر ، يمكن استخدامها ليس فقط للعمليات التي تحتوي على الملفات ، ولكن أيضًا مع الدلائل (مع استخدام الخيارات المقابلة) والأنابيب وأجهزة Windows المختلفة.

CreateFile لديه الكثير من المفاتيح الإضافية المفيدة ، مثل FILE_FLAG_NO_BUFFERING, FILE_ATTRIBUTE_TEMPORARY و FILE_FLAG_SEQUENTIAL_SCAN, والتي يمكن أن تكون مفيدة جدا في سيناريوهات مختلفة.

يمكنك استخدام CreateFile مع اسم الملف لفترة أطول MAX_PATH الشخصيات. قد يكون من المهم لبعض تطبيقات الخادم أو تلك التي يجب أن تكون قادرة على فتحها أي ملف (ماسح ضوئي للفيروسات أو تطبيق النسخ الاحتياطي على سبيل المثال). يتم تمكين هذا باستخدام دلالات مساحة الاسم ، على الرغم من أن هذا الوضع له مخاوفه الخاصة ، مثل القدرة على إنشاء ملف مسمى فعليًا ".." أو L"\xfeff\x20\xd9ab" (حظا سعيدا في محاولة لحذفها في وقت لاحق).

يمكنك استخدام CreateFile في سيناريوهات أمنية مختلفة. أعني ليس فقط استخدام سمات الأمن. إذا كانت العملية الحالية تحتوي على امتياز se_backup_name أو se_restore_name (مثل المسؤولين عادة) وتمكين هذا الامتياز ، يمكن للمرء استخدامه CreateFile لفتح أي ملف أيضا ملف لا يمكنك الوصول إليه من خلال واصف الأمان.

إذا كنت تريد فقط قراءة محتوى الملف ، فيمكنك الاستخدام CreateFile, CreateFileMapping و MapViewOfFile لإنشاء رسم خرائط الملف. ثم يمكنك العمل مع ملف كما هو الحال مع كتلة من الذاكرة ، والتي يمكن أن تزيد من سرعة تطبيقك.

هناك أيضًا استخدامات أخرى للوظيفة الموصوفة بالتفصيل في مقالة MSDN المقابلة.

لذلك يمكنني تلخيصها: فقط إذا كان لديك متطلبات قابلية للنقل الصعبة أو إذا كنت بحاجة إلى تمرير أ FILE* لبعض المكتبة الخارجية ، ثم عليك استخدامها fopen. في جميع الحالات الأخرى ، أوصيك بالاستخدام CreateFile. للحصول على أفضل النتائج ، أنصح أيضًا تعلم Windows API على وجه التحديد ، حيث توجد العديد من الميزات التي يمكنك العثور عليها بشكل جيد.

محدث: لا ترتبط مباشرة بسؤالك ، لكنني أوصيك أيضًا بإلقاء نظرة على المعاملات I/O الوظائف التي يتم دعمها بدءًا من Windows Vista. باستخدام هذه الميزة ، يمكنك ارتكاب مجموعة من التشغيل مع الملفات أو الدلائل أو السجل كمعاملة واحدة لا يمكن مقاطعة. إنها أداة قوية ومثيرة للاهتمام. إذا لم تكن مستعدًا الآن لاستخدام وظائف I/O للمعاملات ، فيمكنك البدء بـ CreateFile ومنفذ التطبيق الخاص بك إلى المعاملات I/O لاحقًا.

نصائح أخرى

هذا يعتمد حقًا على نوع البرنامج الذي تكتبه. إذا كان من المفترض أن تكون محمولة ، fopen سوف تجعل حياتك أسهل. fopen سوف يتصل CreateFile "خلف الكواليس".

تتوفر بعض الخيارات الأكثر تقدماً (التحكم في ذاكرة التخزين المؤقت ، والتحكم في الوصول إلى الملف ، إلخ) فقط إذا كنت تستخدم API Win32 (فهي تعتمد على مقبض ملفات Win32 ، بدلاً من FILE مؤشر في stdio) ، لذلك إذا كنت تكتب تطبيق Win32 خالص ، فقد ترغب في استخدام CreateFile.

CreateFile يتيح لك

  • افتح ملفًا لـ I/O غير المتزامن
  • تمرير تلميحات التحسين مثل file_flag_sequential_scan
  • قم بتعيين إعدادات الأمان والوراثة دون مشكلات الخيوط

لا يعيدون نفس نوع المقبض ، مع كائن FOPEN/FILE ، يمكنك الاتصال بوظائف وقت التشغيل الأخرى مثل FUPS (بالإضافة إلى تحويله إلى مقبض الملف "الأصلي")

كلما كان ذلك ممكنًا ، تفضل الأغلفة الموجهة نحو الكائنات التي تدعم RAII ، مثل كائنات FSTEREAM أو تعزيز ملف IO.

يجب أن تهتم ، بالطبع ، بوضع المشاركة ، لذلك لا يكفي FOPEN () و STL.

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