2011-10-11 29 views
6

Tôi biết bạn có thể kiểm tra nếu một tập tin được sử dụng một thư mục:Kiểm tra xem tập tin là không một thư mục trong Perl

if(-d $filename) 

nhưng làm thế nào bạn có thể kiểm tra nếu nó không phải là một thư mục?

+2

bản sao có thể có của [Làm thế nào để phân biệt tệp từ một thư mục trong Perl?] (Http://stackoverflow.com/questions/206320/how-do-i-distinguish-a-file-from- a-directory-in-perl) –

+1

Câu hỏi tràn ngăn xếp kinh điển là * [Làm thế nào để phân biệt một tệp từ một thư mục trong Perl?] (http://stackoverflow.com/questions/206320) *. –

Trả lời

15

Bạn có nghĩ đến việc thử những điều sau không?

if (! -d $filename) ... 

Kết quả của -d là, sau khi tất cả, một cái gì đó có thể được coi là một giá trị boolean, vì thế mà logic không điều hành ! sẽ hoạt động tốt.

Và nếu bạn đang theo dõi thứ gì đó cụ thể hơn chứ không phải là "không phải thư mục", hãy xem here. Có khá nhiều thứ không phải là thư mục mà đôi khi nó không có ý nghĩa để coi như các tệp thông thường.

Hãy nhớ rằng giả sử bạn đã xác thực rằng tên tệp tồn tại. Nếu bạn thực hiện ! -d trên tên tệp không tồn tại, tên tệp sẽ trả về true.

Đó là một vấn đề triết học về việc bạn cân nhắc một điều không tồn tại được "không phải là một thư mục", nhưng, nếu bạn muốn đảm bảo nó tồn tại là tốt, bạn có thể sử dụng ! -d kết hợp với -e, một cái gì đó như:

if ((-e $filename) && (! -d $filename)) ... 
+3

Tôi không thể nhận được tới 30 ký tự đủ nhanh ...Tôi nghĩ câu hỏi thực sự làm tôi kinh ngạc. –

+2

Xin lưu ý: tùy thuộc vào cách bạn phân tích nhu cầu của OP, câu trả lời này có thể sai. Cách tôi phân tích cú pháp nó, anh ta muốn biết liệu một cái gì đó là một tập tin NHƯNG không phải là một thư mục - câu trả lời này sẽ trả về đúng ngay cả đối với cái gì đó KHÔNG phải là một tệp ở nơi đầu tiên (ví dụ: '! -d NO_SUCH_FILE' trả về true). – DVK

+0

@DVK, điểm tốt trên đó, câu trả lời cập nhật cho phù hợp. – paxdiablo

2

Kiểm tra toán tử -f để xem liệu có phải là "tệp thông thường" hay không. Điều này loại trừ các thư mục, nhưng cũng loại trừ những thứ như đường ống và các nút thiết bị.

if (-f $filename) { ... 
3

Với tinh thần TIMTOWTDI:

unless (-d $filename) 
+0

Rất thanh lịch mặc dù – Pavel

5

Để kiểm tra xem một cái gì đó là một tập tin, NHƯNG không phải là một thư mục, bạn cần phải chỉ đơn giản là kết hợp 2 bài kiểm tra (không có bài kiểm tra duy nhất):

if (-e $file && !-d $file) { # a file but not a directory } 

Xin lưu ý rằng:

  • Với tất cả sự tôn trọng, câu trả lời của paxdiablo là sai cho cách câu hỏi được diễn đạt (tinh khiết !-d không hoạt động cho những gì người dùng hỏi khi nó kiểm tra xem một chuỗi ngẫu nhiên không phải là một thư mục hay không không phải là một thư mục). Ví dụ. !-d NO_SUCH_FILE trả về giá trị đúng.

  • Câu trả lời của Greg có thể chính xác tùy thuộc vào việc người dùng ban đầu có nghĩa là bao gồm các tệp không đồng bằng (ví dụ: liên kết tượng trưng, ​​ống được đặt tên, v.v.) trong định nghĩa của họ về "tệp không phải là thư mục" hay không. Nếu họ có nghĩa là để bao gồm tất cả những "tập tin" đặc biệt, câu trả lời của Greg cũng sai như "-f" loại trừ chúng (như Greg một cách khôn ngoan ghi nhận trong câu trả lời của mình ở nơi đầu tiên).

Các vấn đề liên quan