मैं कैसे पता लगाऊं कि क्लिपबोर्ड में डेटा कॉपी करने के लिए है या स्थानांतरित करने के लिए?


मैं क्लिपबोर्ड से फ़ाइलों की सूची प्राप्त कर सकता हूं लेकिन मैं यह पता नहीं लगा सकता कि यह डेटा स्थानांतरित करने के लिए है या कॉपी करने के लिए?

जब उपयोगकर्ता “कट” और “पेस्ट” दोनों विकल्पों पर क्लिक करता है तो डेटा क्लिपबोर्ड में सेट हो जाता है और हम इसे कुछ कोड का उपयोग करके पुनर्प्राप्त कर सकते हैं, लेकिन हम एक साथ कैसे पता लगा सकते हैं कि यह क्लिपबोर्ड डेटा कॉपी या कट के लिए है?

मैंने क्या प्रयास किया है:

मैं इस कोड का उपयोग करके क्लिपबोर्ड से फ़ाइलों की सूची प्राप्त कर सकता हूं:
IDataObject डेटा = क्लिपबोर्ड.GetDataObject();
यदि (!data.GetDataPresent(DataFormats.FileDrop))
वापस करना;
डोरी[] क्लिपबोर्डडेटा = (स्ट्रिंग[])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

बिलकुल नहीं। और आपको इसकी कभी जरूरत नहीं पड़ेगी. सबसे पहले, ऐसा कोई भेद नहीं है। प्रश्न का कोई मतलब ही नहीं है।

मैं यह भी समझा दूं कि: “क्लिपबोर्ड मूव” जैसी कोई चीज़ नहीं है। यह एक शुद्ध एप्लिकेशन-साइड भाग है। आप बस इस विचार से चूक गए। हाँ, कुछ एप्लिकेशन “कट फ़ाइल – पिछली फ़ाइल” संचालन की पेशकश करते हैं जो कार्यात्मक रूप से “मूव” के बराबर है, लेकिन यह एक रूपक के अलावा और कुछ नहीं है। ओएस में ऐसी कोई बात नहीं है.

एक उदाहरण “मूविंग फाइल्स” है। यह इस प्रकार काम करता है: सबसे पहले, एप्लिकेशन “फ़ाइलें काटें” कमांड को संभालता है और स्थानांतरण के लिए निर्धारित कुछ फ़ाइलों को चिह्नित करता है। यह समझना महत्वपूर्ण है कि कुछ भी नहीं काटा जाता है। अगला आदेश “फ़ाइलें चिपकाएँ” माना जाता है। यदि इसे किसी अन्य क्लिपबोर्ड ऑपरेशन से पहले जारी किया जाता है, तो फ़ाइलें आसानी से स्थानांतरित हो जाती हैं। यदि उपयोगकर्ता कुछ और करता है, तो “कट” कमांड को अनदेखा कर दिया जाता है; और फ़ाइलें वहीं रुक जाती हैं जहाँ वे थीं। यदि उपयोगकर्ता वह आदेश जारी करता है, तो फ़ाइलें स्थानांतरित हो जाती हैं। एक्सेल सहित स्प्रेडशीट की कोशिकाओं के साथ भी यही चीजें होती हैं।

आप अपने एप्लिकेशन में वही तकनीक विकसित कर सकते हैं। सवाल यह है कि क्या सिस्टम क्लिपबोर्ड भी इसमें शामिल है? जवाब हां और नहीं है। जैसा कि पिछले पैराग्राफ में बताए गए दोनों उदाहरणों में बताया गया है, आपके आवेदन को आवेदन प्रक्रिया के कई उदाहरणों में से एक उदाहरण में निष्पादित किया जा सकता है। यदि यह हमेशा से था वही उदाहरण, क्लिपबोर्ड का उपयोग करना व्यर्थ होगा। लेकिन एक ही एप्लिकेशन को कई अलग-अलग प्रक्रियाओं में निष्पादित किया जा सकता है; और प्रक्रियाएं अलग-थलग हैं। उन्हें इस फ़ाइल कॉपी/पेस्ट/मूव गतिविधि पर संचार करने की आवश्यकता है; और यह उपलब्ध सिस्टम क्लिपबोर्ड के माध्यम से आसानी से किया जाता है। इसी तरह की चीज़ को लागू करने के लिए आपको बस थोड़े से तार्किक तर्क की आवश्यकता है।

इसके अलावा, फ़ाइल हेरफेर के संबंध में: आप शेल एपीआई का उपयोग करके कई असंबंधित एप्लिकेशन प्राप्त कर सकते हैं। न केवल वे अलग-अलग प्रक्रियाएँ हैं, बल्कि विभिन्न अनुप्रयोगों की प्रक्रियाएँ भी हैं। और वे इस पहलू में सिस्टम क्लिपबोर्ड के माध्यम से संचार कर सकते हैं।

बस इतना ही।

-एसए

समाधान 1

क्लिपबोर्ड के साथ यह संभव नहीं है, यह क्लिपबोर्ड का उपयोग करने वाले एप्लिकेशन द्वारा निर्धारित किया जाता है। क्षमा मांगना !

समाधान 2

जब आप फ़ाइल ड्रॉप का उपयोग करते हैं, तो आप केवल शिफ्ट और नियंत्रण कुंजियाँ जाँचते हैं:

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

コメント

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