سؤال

هل هناك طريقة في .NET لمعرفة بالضبط أي عملية قفلت ملف؟

تعديل: أنا أفعل هذا لأنني أريد أن أخبر المستخدم أنه لا يمكنهم تعديل/فتح الملف ، لأنه في الوقت الحالي ، فإن برنامجًا آخر يستخدمونه (مثل Excel) يفتح. نأمل أن يساعد هذا.

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

المحلول

الجواب القصير لهذا هو لا.

ومع ذلك ، فإن الإجابة الطويلة هي أن هناك العديد من مكالمات API وطرق WMI التي يمكنك استخدامها للعثور على هذه المعلومات ، ولكن لا تتوقع أن تكون سريعة وبسيطة.

إذا كنت ترغب في استخدام مكالمات API ، ألق نظرة على ntquerysystemation وظيفة مع معلمة System_Process_Information. هذه واحدة من تلك الأساليب "غير الموثقة" الجميلة التي تأتي مع إخلاء المسئولية الرائع:

يمكن تغيير ntquerysteminformation أو غير متوفر في الإصدارات المستقبلية من Windows. يجب أن تستخدم التطبيقات الوظائف البديلة المدرجة في هذا الموضوع.

لذلك أود أن أقترح تجنب ذلك لصالح استخدام WMI.

يمكنك استعمال ال WMI WIN32_PROCESS الفصل لتعداد جميع العمليات التي تعمل حاليًا على الجهاز ، ثم تعداد جميع المقابض التي يتمسك بها كل عملية حتى تجد الملف الذي تبحث عنه. للأسف ، لا توجد طريقة بسيطة للذهاب "مهلا ، وهي العملية التي تقفل هذا الملف" ، فهي تعمل فقط في الاتجاه الآخر الذي يتعين عليك البحث فيه عن قائمة العملية حتى تجد الصورة التي تقفل الملف الذي تهتم به.

أوصي بمقال صغير لطيف على عنوان CodeProject بعنوان كيفية: (تقريبًا) كل شيء في WMI عبر C# الجزء 2: العمليات. (الجزء 1 هو أيضًا قراءة جيدة إذا كنت تحب هذا النوع من الأشياء)

نصائح أخرى

حسنًا ... إنها ليست بالضبط طريقة .NET للقيام بذلك ... ولكن على افتراض أنك تريد فقط معرفة استخدام أداة سهلة ، تحقق من التعامل من sysinternals.

يبدو أن شخصًا ما قد اكتشف هذا (وقد تتعلم بعض الفرنسية أيضًا :))

http://www.axcis.com.au/bb/viewtopic.php؟p=505

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