كيف يمكنني اكتشاف ما إذا كانت البيانات الموجودة في الحافظة مخصصة للنسخ أو النقل؟


يمكنني الحصول على قائمة الملفات من الحافظة ولكن لا يمكنني اكتشاف ما إذا كانت هذه البيانات مخصصة للنقل أو النسخ؟

عندما ينقر المستخدم على خيار “قص” و”لصق”، يتم تعيين البيانات في الحافظة ويمكننا استعادتها باستخدام بعض التعليمات البرمجية ولكن كيف يمكننا في الوقت نفسه معرفة ما إذا كانت بيانات الحافظة هذه مخصصة للنسخ أو القص؟

ما حاولت:

يمكنني الحصول على قائمة الملفات من الحافظة باستخدام هذا الرمز:
بيانات IDataObject = Clipboard.GetDataObject();
إذا (!data.GetDataPresent(DataFormats.FileDrop))
يعود؛
خيط[] بيانات الحافظة = (string[])data.GetData(DataFormats.FileDrop);

الحل 5

ج #
[Flags]
public enum NativeDropEffect : uint
{
    None = 0x00000000,
    Copy = 0x00000001,
    Move = 0x00000002,
    Link = 0x00000004,
    Scroll = 0x80000000
}

IDataObject iData = System.Windows.Forms.Clipboard.GetDataObject();
var fileDrop = (string[])iData.GetData(DataFormats.FileDrop);
NativeDropEffect dropEffect;
using (var reader = new BinaryReader((MemoryStream)iData.GetData("Preferred DropEffect")))
{
    dropEffect = (NativeDropEffect)reader.ReadUInt32();
}

if(dropEffect.HasFlag(NativeDropEffect.Copy))
{
//copy
}
else if(dropEffect.HasFlag(NativeDropEffect.Move))
{
//cut
}

عند نسخ ملف، يبدو أنه يتم تعيين علامتي النسخ والارتباط، بينما يتم تعيين علامة نقل البت عند القطع.

الحل 3

مستحيل. ولن تحتاج إليها أبدًا. بادئ ذي بدء، لا يوجد مثل هذا التمييز. السؤال ببساطة لا معنى له.

اسمحوا لي أيضًا أن أوضح أنه: لا يوجد شيء اسمه “نقل الحافظة”. هذا جزء خالص من جانب التطبيق. لقد فاتتك الفكرة للتو. نعم، تقدم بعض التطبيقات عمليات “قص الملف – الملف السابق” والتي تعادل وظيفيًا عملية “النقل”، لكن هذا ليس سوى استعارة. في نظام التشغيل، لا يوجد شيء من هذا القبيل.

أحد الأمثلة على ذلك هو “نقل الملفات”. هذه هي الطريقة التي تعمل بها: أولاً، يتعامل التطبيق مع أمر “قص الملفات” ويقوم ببساطة بوضع علامة على بعض الملفات المجدولة للنقل. من المهم أن نفهم أنه لم يتم قطع أي شيء. من المفترض أن يكون الأمر التالي هو “لصق الملفات”. إذا تم إصداره قبل أي عملية حافظة أخرى، فسيتم نقل الملفات ببساطة. إذا قام المستخدم بشيء آخر، فسيتم تجاهل أمر “القص” ببساطة؛ والملفات تبقى حيث كانت. إذا أصدر المستخدم هذا الأمر، يتم نقل الملفات. تحدث نفس الأشياء مع خلايا جدول البيانات، بما في ذلك برنامج Excel.

يمكنك تطوير نفس التقنية في طلبك. السؤال هو: هل حافظة النظام متورطة أصلاً؟ الجواب هو نعم ولا. كما هو الحال في كلا المثالين الموضحين في الفقرة السابقة، يمكن تنفيذ طلبك في حالة واحدة، من بين عدة حالات من عملية التقديم. لو كان دائما نفس المثال، فإن استخدام الحافظة سيكون بلا جدوى. ولكن يمكن تنفيذ نفس التطبيق في عدة عمليات مختلفة؛ والعمليات معزولة. إنهم بحاجة إلى التواصل بشأن نشاط النسخ/اللصق/النقل لهذا الملف؛ ويتم ذلك بسهولة عبر حافظة النظام المتاحة. كل ما تحتاجه لتنفيذ شيء مماثل هو القليل من التفكير المنطقي.

علاوة على ذلك، فيما يتعلق بمعالجة الملف: يمكن أن يكون لديك عدة تطبيقات غير مرتبطة باستخدام Shell API. ليست فقط عمليات مختلفة، ولكن أيضًا عمليات تطبيقات مختلفة. ويمكنهم التواصل من خلال حافظة النظام في هذا الجانب.

هذا كل شئ.

-سا

الحل 1

هذا غير ممكن مع الحافظة، بل يتم تحديده بواسطة التطبيق الذي يستخدم الحافظة. آسف !

الحل 2

عند استخدام ميزة إسقاط الملفات، ما عليك سوى التحقق من مفتاحي Shift وControl:

ج #
if ((ModifierKeys & Keys.Shift) != 0)
    {
    // It's a move operation.
    ...
    }

コメント

タイトルとURLをコピーしました