2010-12-28 33 views
15
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")) as $file) { 
    echo "$file\n"; 
} 

Có cách nào để mã này không ném UnexpectedValueException "không mở được thư mục: Quyền bị từ chối" bất kỳ khi nào có thư mục con không đọc được bên trong thư mục tôi cố liệt kê?Tôi có thể làm cho RecursiveDirectoryIterator bỏ qua các thư mục không đọc được không?

CẬP NHẬT

Chuyển đổi foreach() để while() và gọi một cách rõ ràng Iterator::next() bọc trong try() catch {} không giúp. Mã này:

$iter = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")); 
while($iter->valid()) { 
    $file = $iter->current(); 
    echo "$file\n"; 
    try { 
     $iter->next(); 
    } catch(UnexpectedValueException $e) { 
    } 
}; 

là vòng lặp vô hạn nếu có thư mục con không thể đọc được.

+0

quấn nó thành các khối catch. và nó có vẻ là một ideea xấu để tạo ra các đối tượng mới ngay bên trong dấu ngoặc đơn foreach – s3v3n

+0

Để xây dựng trên nhận xét của s3v3n. Nó có vẻ là một ý tưởng tồi, bởi vì chính xác những gì đang xảy ra là rất khó để xác định. Mã tốt không phải lúc nào cũng là mã nhỏ nhất hoặc nhanh nhất. – DampeS8N

+0

Không khó để xác định điều gì sẽ xảy ra nếu bạn biết RecursiveIteratorIterator và RecursiveDirectoryIterator là gì và trường hợp sử dụng phổ biến của chúng là gì. Đó là mã đơn giản. –

Trả lời

19

Rõ ràng bạn có thể vượt qua $flags tham số để xây dựng. Chỉ có one flag in the docs, nhưng nó thực hiện chính xác những gì bạn muốn: catches exceptions during getChildren() calls and simply jumps to the next element.

Thay đổi mã tạo lớp học của bạn để

new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator("."), 
    RecursiveIteratorIterator::LEAVES_ONLY, 
    RecursiveIteratorIterator::CATCH_GET_CHILD); 

và nó cũng làm việc

+0

Đó chính xác là những gì tôi cần. Cảm ơn nhiều! –

+0

Tôi có một vấn đề tương tự được yêu cầu tại đây http://stackoverflow.com/questions/14410899/unable-to-skip-unreadable-directories-with-recursivedirectoryiterator bạn có bất kỳ ý tưởng nào về cách tôi có thể làm lại cho bạn giải pháp để giải quyết vấn đề của tôi không? – ak85

+0

Cụ thể, cờ là: CATCH_GET_CHILD –

0

Có thể vị trí trình lặp sẽ vẫn hợp lệ ngay cả khi một thư mục không thể đọc được.

Bạn có thể kiểm tra trạng thái của mục nhập thư mục. Cẩu thả chưa được kiểm tra mẫu mã:

$iter = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")); 
foreach ($iter as $dir) { 
    if($dir->isReadable()){ 
     //do something 
    } 
} 
+0

Nó không hoạt động. Ngoại lệ được ném như là iterator tiến tới vị trí tiếp theo. –

7

Bạn có thể làm một cái gì đó như thế này:

class ReadableFilter extends RecursiveFilterIterator{ 
    public function accept(){ 
      return $this->current()->isReadable(); 
    } 
} 

$filteredIterator = new RecursiveIteratorIterator(new ReadableFilter(new RecursiveDirectoryIterator("."))); 

foreach ($filteredIterator as $file){ 
    echo "$file\n"; 
} 
+0

Điều đó rất thú vị. –

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