سؤال

لدي لتطوير التطبيق الذي يوزع ملف سجل ويرسل بيانات محددة إلى ملقم.يجب أن تعمل على لينكس و ويندوز.

تظهر المشكلة عندما أريد فحص سجل النظام المتداول (التي بإلحاق .1 اسم يخلق واحد جديد بنفس الاسم).على ويندوز (لم تختبر بعد على لينكس) أنا لا يمكن إعادة تسمية الملف الذي كنت قد فتحت مع std::ifstream() (حصرية؟) حتى لو فتحه في "وضع الإدخال" (ios::in).

هل هناك عبر منصة طريقة لفتح الملف في غير حصري الطريقة ؟

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

المحلول

هل هناك طريقة لفتح ملف في غير حصرية ،

نعم ، وذلك باستخدام Win32 اجتياز مختلف FILE_SHARE_Xxxx أعلام CreateFile.

هو عبر منصة ؟

لا يتطلب منصة رمز معين.

بسبب مزعج التوافق المخاوف (DOS التطبيقات ، كونها واحدة من المهام ، نفترض أن لا شيء يمكن حذف الملف من تحت لهم ، أيأنها يمكن أن fclose() ثم fopen() دون أن يحدث أي شيء خاطئا ، Win16 الحفاظ على هذا الافتراض ترقية DOS التطبيقات أسهل ، Win32 الحفاظ على هذا الافتراض ترقية التطبيقات Win16 أسهل و انها فظيعة), Windows الافتراضي فتح الملفات حصرا.

الأساسية OS البنية التحتية يدعم حذف/إعادة تسمية الملفات المفتوحة (على الرغم من أنني أعتقد أنه لا يجب تقييد ملفات الذاكرة المعنونة لا يمكن حذفها ، والذي أعتقد أنه ليس قيدا الاطلاع على *nix) ، ولكن الافتراضي فتح دلالات لا.

C++ لديه أي فكرة من أي من هذا ، C++ بيئة التشغيل هو إلى حد كبير نفس دوس بيئة التشغيل--لا توجد تطبيقات أخرى قيد التشغيل في وقت واحد ، لذلك لا تحتاج إلى السيطرة على ملف تقاسم.

نصائح أخرى

ليس القراءة العملية التي تتطلب وضع خاص ، هو إعادة تسمية, لأن هذا هو في الأساس نفسه كما نقل الملف إلى موقع جديد.

لست متأكدا ولكن أنا لا أعتقد أن هذا يمكن القيام به.حاول نسخ الملف بدلا من ذلك ، وبعد حذف/استبدال الملف القديم عندما لم يعد يقرأ.

Win32 الملفات دلالات تتطلب أن ملف إعادة تسمية لا تكون مفتوحة (في أي وضع) في وقت كنت تفعل إعادة تسمية.سوف تحتاج إلى إغلاق الملف إعادة تسمية ومن ثم إنشاء ملف سجل جديد.

Unix نظام الملفات دلالات تسمح لك لإعادة تسمية ملف مفتوح لأن اسم الملف هو مجرد مؤشر إلى inode.

إذا كنت القراءة فقط من الملف أعلم أنه يمكن القيام به مع نظام التشغيل windows api CreateFile.فقط تحديد FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE كإدخال إلى dwShareMode.

Unfortunally هذا ليس crossplatform.ولكن قد يكون هناك شيء مماثل في لينكس.

راجع msdn للحصول على مزيد من المعلومات على CreateFile.

تحرير:مجرد ملاحظة سريعة حول جريج Hewgill التعليق.لقد اختبرت مع FILE_SHARE* الاشياء (أيضا يكون متأكدا 100٪).وأنه من الممكن أن كلا وحذف وإعادة تسمية الملفات في ويندوز إذا كنت فتح للقراءة فقط و تحديد FILE_SHARE* المعلمات.

كنت تأكد من أنك لا تبقى الملفات المفتوحة.وهذا يؤدي إلى أشياء غريبة إذا تعطل التطبيق على سبيل المثال.ماذا سأفعل:

  1. مجردة (القراءة / الكتابة / التدحرج إلى ملف جديد) في فئة واحدة ، وترتيب إغلاق الملف عندما تريد أن يتدحرج إلى واحد جديد في تلك الفئة.(هذا هو أبرع طريقة وبما أنك بالفعل أكثر من لفة رمز كنت بالفعل في منتصف الطريق هناك.)
  2. إذا كان يجب أن لديك متعددة القراءة/الكتابة الوصول إلى نقطة بحاجة إلى كل الميزات من fstreams و لا أريد أن أكتب إكمال المجمع ثم فقط عبر منصة الحل أستطيع أن أفكر دائما إغلاق الملف عندما كنت لا حاجة إليها ، ولها أكثر من لفة رمز محاولة الحصول على وصول خاص إلى الملف عدة مرات عندما يحتاج إلى أكثر من لفة قبل التخلي.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top