2011-11-21 7 views
6

मैं एक प्रोग्राम है जो निम्नलिखित करता लिखा है ...क्या मेरे डेल्फी प्रोग्राम को बड़ी संख्या में फाइलों की प्रतिलिपि बनाने की प्रतीक्षा करने का कोई तरीका है?

  • मॉनिटर एक विशिष्ट फ़ाइल नाम है कि अंततः एक उप फ़ोल्डर में बनाया जाएगा साथ एक नई फ़ाइल के निर्माण के लिए एक फ़ोल्डर।
  • फ़ाइल के निर्माण पर, उप फ़ोल्डर्स पथ को टीएलआईस्ट के रूप में एक कतार में जोड़ा जाता है।
  • फ़ाइलों को निर्माण आदेश में संसाधित किया जाना चाहिए।
  • सबफ़ोल्डर में सभी फ़ाइलों (इस मामले में छवियों) को संसाधित करने के लिए एक प्रक्रिया को बुलाया जाता है जिसमें फ़ाइलों को किसी नेटवर्क स्थान पर ले जाना शामिल होता है।
  • उपफोल्डर पथ कतार (टीएलआईस्ट) से हटा दिया गया है।
  • यदि कतार में कोई और पथ मौजूद है, तो अगला पथ प्रसंस्करण प्रक्रिया में पारित किया जाता है।
समस्या मैं कर रहा हूँ

उस समय नंबर और इतने छवियों का आकार पर निर्भर करता है किसी नेटवर्क स्थान पर फ़ाइलों की प्रतिलिपि करने के लिए ...

वहाँ एक रास्ता डेल्फी प्रतीक्षा करने के लिए प्राप्त करने के लिए है है खत्म करने के लिए फ़ाइल ऑपरेशन की प्रक्रिया के लिए?

मैंने थोड़ी देर की कोशिश की जो एक बुलियन मूल्य बदलने के लिए इंतजार कर रहा था (जब फ़ाइल पर प्रतिलिपि बनाई गई अंतिम फाइल को बदल दिया गया था) लेकिन उस एप्लिकेशन को लटका दिया गया था (यहां तक ​​कि application.processMessage के साथ) और dirMonitor घटक विफल अगले उप फ़ोल्डर को TList में जोड़ें।

किसी भी सुझाव की सराहना की जाएगी।

अग्रिम धन्यवाद।


replys के लिए धन्यवाद ...

मैं जो आदर्श लग रहा है ... हालांकि मैं केवल डेल्फी 7 इसलिए इसकी एक नहीं जाने के लिए उपयोग किया OmniThread पर एक नज़र था।

समस्या इम होने कि फ़ोल्डरों भिन्न आकार और नेटवर्क यातायात आदि की वजह से समय की मात्रा बदलती ले हस्तांतरण करने के लिए ... छवियों का एक बहुत कुछ के साथ एक फ़ोल्डर केवल कुछ छवियों के साथ एक फ़ोल्डर द्वारा पीछा किया जाता है है, दोनों में से छोटे नेटवर्क गंतव्य तक पहुंच रहा है। नेटवर्क विलुप्त होने वाला तीसरा पक्ष प्रिंट स्पूलर है, इसलिए प्रिंट गलत क्रम में आते हैं।

सरलीकृत कोड:

procedure TForm1.programTimerTimer(Sender: TObject); 
begin 
    if (fileOperationInProgress = false) AND (programPaused = false) then 
    begin 
     processOrderQueue; 
    end; 
end; 

procedure TForm1.processOrderQueue; 
begin 
    // gets folder paths from queue 
    // processes images 
    // copy to print spooler (network location) 

    copyFolder(fromPath, toPath); 

    // remove temp files 
end; 

procedure TForm1.copyFolder(copyFrom : String; copyTo : String); 
var 
    fos : TSHFileOpStruct; 
begin 
    fileOperationInProgress := True; 

    ZeroMemory(@fos, SizeOf(fos)); 

    with fos do 
    begin 
     wFunc := FO_COPY; 
     fFlags := FOF_FILESONLY or FOF_SILENT; 
     pFrom := PChar(copyFrom); 
     pTo := PChar(copyTo) 
    end; 

    ShFileOperation(fos); 


    fileOperationInProgress := False; 
end; 

सोचो मैं जवाब के साथ आए हैं ... मैं एकल थ्रेड में सभी फाइल operationions करते हैं और एक वैश्विक 'व्यस्त' स्थापित करने के लिए जा रहा हूँ बुलियन जब यह शुरू होता है और इसे पूरा होने पर फिर से बदल देता है। इस तरह से जब कोई फ़ाइल ऑपरेशन प्रगति पर है तो शेल मॉनीटर संदेशों को याद नहीं करेगा।

+3

फाइलों की प्रतिलिपि बनाने के लिए आप किस फ़ंक्शन का उपयोग कर रहे हैं? [SHFileOperation] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762164%28v=vs.85%29.aspx)? – RRUZ

+1

आप फ़ाइलों की प्रतिलिपि कैसे बना रहे हैं? कृपया कोड दिखाएं। –

+2

आप [कॉपी-फाइल-इन-ए-थ्रेड] (http://stackoverflow.com/questions/1766626/copy-file-in-a-thread) में गैबर के उदाहरण का पालन करने का प्रयास कर सकते हैं। जब कॉपी समाप्त हो जाती है तो मुख्य धागा अधिसूचित किया जाता है। –

उत्तर

1

आप एक फ़ाइल सिस्टम घड़ी को लागू कर सकते हैं। अनिवार्य रूप से, आप निम्नलिखित झंडे के साथ एक फ़ाइल हैंडल बनाएँ:

CreateFile(PChar(FDirectoryToWatch), FILE_LIST_DIRECTORY or GENERIC_READ, 
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, 
FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0); 

और फिर एक पाश ReadDirectoryChangesW कॉल करने के लिए पैदा करते हैं।

लिंक्ड एक उदाहरण वर्ग है: Why does ReadDirectoryChangesW omit events?

केवल एक चीज मैं अलग तरीके से करते हैं (याद है कि जब में घटना बुला प्रक्रिया यह शायद निष्पादित परिवर्तन की सूचना के लिए कक्षा के निर्माण में एक घटना प्रदान करना है सिंक्रनाइज़ करने की जरूरत है)।

संबंधित मुद्दे

 संबंधित मुद्दे