2011-07-29 38 views
7

Cập nhật: Giải pháp dưới đâyAppleScript: Làm thế nào để kiểm tra xem một cái gì đó là một thư mục hoặc một tập tin


Giả sử bạn có một danh sách các mục đã chọn từ Finder. Giả sử có một số tệp, thư mục, các gói khác nhau và thậm chí một số ứng dụng được bao gồm trong lựa chọn.

Bây giờ, bạn chỉ muốn những mục đó (theo thuật ngữ UNIX) thư mục. I E. bạn chỉ muốn các mục bạn có thể cd vào trong thiết bị đầu cuối.

Bạn có thể kiểm tra tài sản kind mỗi mục và xem nếu nó bằng "Thư mục", nhưng điều đó không làm việc cho bó ứng dụng hoặc gói khác/gói, mặc dù họ đang có trong thực tế "thư mục" (thư mục)

Nếu các mục là đối tượng tệp thực sự (không phải bí danh), bạn có thể kiểm tra thuộc tính class của mỗi mục ... ngoại trừ việc đó không phải lúc nào cũng hoạt động, vì các gói hiện là trường hợp "tệp tài liệu" và ứng dụng là các tệp "tệp ứng dụng".

Tệ hơn nếu bạn chỉ có danh sách bí danh thay vì đối tượng tệp thực, vì bạn không thể kiểm tra thuộc tính class; nó sẽ luôn chỉ nói "bí danh". Các giải pháp duy nhất tôi có thể nghĩ đến, là để có được đường dẫn POSIX của mỗi mục và xem liệu nó có dấu gạch chéo ở phía trước hay không hoặc gửi đường dẫn đến tập lệnh được viết bằng ngôn ngữ khác, có thể kiểm tra nếu một cái gì đó là một thư mục hay không.

Cả hai ý tưởng đều có vẻ điên rồ đối với tôi. Việc kiểm tra dấu gạch chéo ở phía trước là vô cùng khó khăn và mong manh, và cho tất cả mọi thứ vào một kịch bản lệnh khác là hoàn thành quá mức cần thiết.


Cập nhật: gì ASMUS gợi ý dưới đây dường như là chỉ một giải pháp tốt , vì nó dường như không có cách nào cho AppleScript để con nó ra ngày của riêng mình :

do shell script "file -b " & filePosixPath 

Điều đó sẽ trả về chuỗi "thư mục" cho thư mục, gói, ứng dụng, gói, v.v.
Nhưng lưu ý (!) Cho đĩa, nó trả về "thư mục dính".

Dưới đây là một hàm tổng quát rằng hoạt động khá tốt

on isDirectory(someItem) -- someItem is a file reference 
    set filePosixPath to quoted form of (POSIX path of (someItem as alias)) 
    set fileType to (do shell script "file -b " & filePosixPath) 
    if fileType ends with "directory" then return true 
    return false 
end isDirectory 
+2

Vâng, tôi muốn nói là giải pháp đơn giản nhất là để đưa các đường dẫn POSIX qua công cụ dòng lệnh 'tệp', ví dụ: 'file -b/Applications/Safari.app' chỉ trả về" thư mục ". Cần phải dễ dàng kết hợp nó trong một vòng lặp 'do shell script'. – Asmus

+0

@Asmus: Có lẽ bạn đang đúng. Sau khi tôi viết câu hỏi, tôi nhận ra rằng tôi chỉ có thể làm một lệnh shell nhanh hơn là một kịch bản lệnh shell đầy đủ. Tuy nhiên, nó có vẻ lạ khi phải đi ra ngoài AppleScript để tìm ra một cái gì đó cơ bản như có hay không một cái gì đó là một thư mục. Tôi sẽ để lại câu hỏi trong một ngày hoặc lâu hơn, và trong khi chờ đợi, bạn có thể tự do viết bình luận cho bạn để có được điểm :) – Flambino

+0

@Flambino Tôi không thể đưa ra câu hỏi hay vì tôi đã sử dụng hết bình chọn lên! :( – fireshadow52

Trả lời

6

Có một giải pháp đơn giản AppleScript. Bạn có thể kiểm tra xem một cái gì đó có phải là "gói" hay không bằng cách sử dụng các sự kiện hệ thống.

tell application "Finder" to set theItems to (selection) as alias list 

set canCDItems to {} 
tell application "System Events" 
    repeat with anItem in theItems 
     if anItem is package folder or kind of anItem is "Folder" or kind of anItem is "Volume" then 
      set end of canCDItems to contents of anItem 
     end if 
    end repeat 
end tell 
return canCDItems 
+0

Thú vị! Odd rằng từ vựng đó được chôn trong System Events thay vì Finder, nhưng ít nhất nó tồn tại. Tôi đã kết thúc bằng cách sử dụng giải pháp của Asmus, nhưng bạn đã trả lời câu hỏi ban đầu, do đó, mũ tip (và đánh dấu) cho bạn. Cảm ơn! – Flambino

+2

Xin chào. Sự kiện hệ thống đã được tạo để tải tải xuống Trình tìm kiếm. Về cơ bản, Finder thường bận rộn với các tác vụ liên quan đến máy tính, vì vậy tốt nhất nên hỏi các sự kiện hệ thống để thực hiện các công việc thay vì Finder khi có thể. Khi các sự kiện hệ thống như vậy có thể thực hiện hầu hết những thứ mà Finder có thể thực hiện và đôi khi còn hơn thế nữa. Tôi sẽ đề nghị bất kỳ lúc nào bạn nghĩ đến việc sử dụng Trình tìm kiếm mà bạn kiểm tra xem sự kiện hệ thống có thể thực hiện thay thế hay không. – regulus6633

+0

Cảm ơn thông tin cơ bản. Tôi không biết đó là nguồn gốc của sự kiện hệ thống, nhưng nó có ý nghĩa rất nhiều. Tôi sẽ xem xét kỹ hơn từ điển của Sự kiện hệ thống ngay bây giờ. Nhiều nghĩa vụ! – Flambino

0

Tôi cần hôm nay, vì tôi đã cố gắng cắm một vài công cụ khác vào Finder cho Mountain Lion và muốn kiểm tra xem các mục hoặc mục đã chọn là thư mục hay tệp. Điều này làm việc cho tôi:

tell application "Finder" 
    set sel1 to the selection 
    set class1 to class of (item 1 of sel1) 
    set cs to (class1 as string) 
    ... 
    if cs = "folder" or cs contains "class cfol" then 
    set choice to display alert "Which tool?" buttons {"opendiff", "diffmerge"} 
    set tool to (button returned of choice) 

tôi thấy tôi cần thiết để kiểm tra cs cho cả hai trường hợp, tùy thuộc vào việc tôi đã chạy trong AppleScript Editor hoặc là kết quả của nhấp chuột vào một nút trên thanh công cụ trên Finder.Cách xa gọn gàng nhất nhưng ngắn hơn giải pháp chỉ có AppleScript trước đây, đây sẽ là đề xuất thay thế của tôi

on isDirectory(someItem) 
    ((class of someItem) as string) contains "fol" 
end isDirectory 

Kết quả kiểm tra đầy đủ trong mọi trường hợp được chào đón!

1

Nếu biến chỉ là một chuỗi, sử dụng hình thức này:

on isDirectory(someItem) -- someItem is a string 
    set filePosixPath to quoted form of (POSIX path of someItem) 
    set fileType to (do shell script "file -b " & filePosixPath) 
    if fileType ends with "directory" then return true 
    return false 
end isDirectory 
0

tiêu chuẩn bổ sung cung cấp này (không có hệ thống sự kiện cần thiết):

set isBundleType to package folder of (info for (choose file)) 
Các vấn đề liên quan