2010-01-19 10 views
7

के साथ पूर्ण निर्देशिका सामग्री प्राप्त करें मुझे एक सूची के रूप में एक फ़ोल्डर और इसके सबफ़ोल्डर की संपूर्ण (दृश्यमान) सामग्री प्राप्त करने की आवश्यकता है। क्या यह संभव है?ऐप्पलस्क्रिप्ट

उत्तर

7

मुझे यकीन है कि एक शेल कमांड है जो इसे तेजी से कर सकता है, लेकिन यहां शुद्ध एप्पलस्क्रिप्ट में एक तरीका है जो आपको स्वरूपित करने पर पूर्ण नियंत्रण देता है कि आप कौन सी जानकारी प्रदर्शित करना चाहते हैं।

property kFileList : {} 

tell application "Finder" 
    set source_folder to choose folder with prompt "Please select directory." 
    my createList(source_folder) 
end tell 

on createList(item_list) 
    set the the_items to list folder item_list without invisibles 
    set item_list to item_list as string 
    repeat with i from 1 to number of items in the the_items 
     set the_item to item i of the the_items 
     set the_item to (item_list & the_item) as alias 
     set this_info to info for the_item 
     set file_name to name of this_info 
     set end of kFileList to file_name 
     if folder of this_info is true then 
      my createList(the_item) 
     end if 
    end repeat 
end createList 

एक तरफ नोट पर, एक फ़ाइल फ़ाइल अनुप्रयोग भी हैं जो एप्पलस्क्रिप्ट से तेज़ी से ऐसा कर सकते हैं।

अद्यतन: इस चर्चा के परिणामस्वरूप, यह फ़ंक्शन फिर से है, लेकिन इस बार अद्यतन API का उपयोग कर रहा है। यह शायद इस्तेमाल कर सकते हैं सकता है कुछ को साफ करने के लिए, लेकिन यह handily पर्याप्त मेरी डेस्कटॉप सूचीबद्ध काम करता है (और यह मेरे लिए एक गहरी, गहरी फ़ोल्डर है):

property kFileList : {} 

tell application "Finder" 
    set source_folder to choose folder with prompt "Please select directory." 
    my createList(source_folder) 
end tell 

return kFileList 

on createList(mSource_folder) 
    set item_list to "" 

    tell application "System Events" 
     set item_list to get the name of every disk item of mSource_folder 
    end tell 

    set item_count to (get count of items in item_list) 

    repeat with i from 1 to item_count 
     set the_properties to "" 

     set the_item to item i of the item_list 
     set the_item to ((mSource_folder & the_item) as string) as alias 

     tell application "System Events" 
      set file_info to get info for the_item 
     end tell 

     if visible of file_info is true then 
      set file_name to displayed name of file_info 
      set end of kFileList to file_name 
      if folder of file_info is true then 
       my createList(the_item) 
      end if 
     end if 

    end repeat 
end createList 

मैं गलत मेलिंग सूची की सदस्यता ली जानी चाहिए, अन्यथा इन क्योंकि एक लापता एपीआई परिवर्तन लागू किए गए थे और मैं कभी नहीं उनके बारे में सुना। मैंने अपनी पहली पेशकश की विधि को दर्जनों परियोजनाओं में काफी हद तक उपयोग किया है क्योंकि यह मूल रूप से ऐप्पल द्वारा प्रदान किया गया कोड था, और इसका उपयोग करके त्रुटियों की पूरी कमी (यहां तक ​​कि इस लेखन के समय भी) ने मुझे कुछ भी अपडेट करने की आवश्यकता नहीं दी ।

टर्नबाउट उचित खेल है, और एमएमसीग्रिल के लिए स्पिटफुल डाउनवोट के लिए मेरी माफ़ी है, और मैं इसे एक अपवर्त के साथ बदल रहा हूं। बस स्पष्ट होने के लिए, मैंने कभी सोचा नहीं कि mmcgrail द्वारा दिया गया जवाब गलत था। यह एक महान एक-लाइन सुविधा विधि है, लेकिन मैं पहले से ही मेरी टिप्पणियों से दूर रह गया हूं। बल्कि, यह उनका नीचे वोट था और इसके संदर्भ में मैंने अपराध किया था। अंत में, यह सिर्फ कोड है, और मुझे लगता है कि हम सभी एक ही कारण के लिए यहां हैं: हम जो भी करते हैं, उसका बेहतर तरीका ढूंढने के लिए। ऐसा लगता है कि अब मेरे पास लागू करने के लिए मेरे कुछ अपडेट हैं।

चीयर्स

+0

कृपया मेरी पोस्ट – mcgrailm

+0

देख मैं अपनी पोस्ट – mcgrailm

+0

पर कोई संपादन ऐसा – user2159978

10

जो आवश्यकतानुसार अधिक काम है। मैं जानता हूँ कि यह एक पुरानी पोस्ट है, लेकिन मैं तुम दोनों को देखने के लिए कि यह कैसे आसान

tell application "Finder" 
    set file_list to entire contents of (choose folder with prompt "Please select directory.") 
    end tell 

हो सकता है टिप्पणी के कारण यदि आप फ़ाइल नामों की सूची तो आप इस

tell application "Finder" 
    set file_list to name of every file of entire contents of (choose folder with prompt "Please select directory.") 
    end tell 

कर सकता है चाहते हैं इस पोस्ट का पालन करने के बाद मैंने इस प्रश्न को देखने के लिए व्यवसाय में विशेषज्ञों के एक समूह से पूछा और निष्पक्ष तरीके से हमारे उत्तर का मूल्यांकन किया और मुझे जो जवाब मिला वह था थिसिस

"आपके घरों पर एक पॉक्स के बारे में कैसे ?:-)

हां, पूरी सामग्री ठीक वही करती है जो आप कहते हैं - लेकिन यह आसानी से बड़े फ़ोल्डरों पर चोक करती है, और हमेशा के लिए लेती है (और यदि आप 10.6 पर हैं तो एक दिन)। छोटी चीजों के लिए ठीक है, जैसे कि फ़ोल्डर में से एक प्रकार की सभी फ़ाइलों को निकालने की तरह, केवल कुछ ही फाइलें होंगी।

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

तो मैं करने से सुनते हैं। घोषणा करें कि मैं गलत था! इन दोनों समाधानों के वैध हैं लेकिन उनके उपयोग में "पॉक्स" या छेद हैं। मेरी एप्पलियां फिलिप को।क्या उसे अपना जवाब संपादित करने का फैसला करना चाहिए (क्योंकि यह मेरा वोट बदलने का एकमात्र तरीका है) मुझे वापस लौटने में खुशी होगी और उसे +1

+0

राइट "की ... हर डिस्क आइटम नहीं मिल सकता है" कुछ लिखते हैं बनाया है, क्योंकि {दस्तावेज़ फ़ाइल "फ़ाइल नाम" के एक बड़े पैमाने पर सूची एप्लिकेशन "फाइंडर", विज्ञापन मतली} की स्टार्टअप डिस्क के फ़ोल्डर "उपयोगकर्ता" फ़ोल्डर के फ़ोल्डर "फ़ोल्डर" फ़ोल्डर के फ़ोल्डर "सबफ़ोल्डर" का फ़ोल्डर और बाद में प्रक्रिया करने के लिए * उस * को नीचे की आवश्यकता के रूप में बहुत अधिक उपयोगी है मेरा वोट –

+0

आपके पास सूची करने के लिए क्या है और आपकी आवश्यकता के अनुसार आइटमों का संदर्भ है यानी फ़ाइल में आइटम को आपके काम करने के तरीके की तुलना में अधिक काम करना है, इसलिए मैंने आपको एक वोट दिया है, मैंने इसे आपको नहीं दिया ऐसा लगता है कि ऐसा लगता है कि – mcgrailm

+0

आपके कैफाइललिस्ट केवल फाइलों की सूची की एक सूची देता है और फ़ाइल से कहां से आया है इसका कोई संदर्भ नहीं देता है, तो फिर फ़ोल्डर को कहां से पता चला कि यह कहां से आया था? – mcgrailm

0

वाह यह काफी देर हो चुकी है लेकिन मैंने जांच की और यह काम करता है।

tell application "Finder" to set folder_root to (choose folder with prompt "Please select directory.") 

set fl to {} 
dump_folder(folder_root) 

on dump_folder(f) 
    global fl 
    tell application "System Events" to set end of fl to (get the POSIX path of f) 
    tell application "Finder" to set nfl to (the items of the contents of f) 
    repeat with nf in nfl 
     dump_folder(nf as alias) 
    end repeat 
end dump_folder 

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