2017-04-07 4 views
2

Directory.EnumerateFiles을 사용할 때 파일이나 디렉토리를 삭제하거나 옮기는 것이 안전합니까? 이 같은파일 시스템을 열거하는 동안 삭제하거나 이동해도 안전한가요?

뭔가 : 나는 일반적으로, 당신은 당신이 열거하는지 수정 안된다, 알고

foreach (var fileName in Directory.EnumerateFiles("Sub")) 
    File.Delete(fileName); 

. 그러나 파일 시스템은 위의 코드가 작동하기 때문에 규칙을 따르지 않는 것 같습니다.

EnumerateDirectoriesEnumerateFileSystemEntries에 동일한 질문이 적용되고 DirectoryInfo 클래스의 동일한 방법이 적용됩니다.

+3

관련 항목 : [반복 중에 디렉토리 내용이 변경되면 Directory.EnumerateFiles는 어떻게됩니까?] (http://stackoverflow.com/questions/29555761/what-happens-with-directory-enumeratefiles-if-directory-content-changes) -during-i) – stuartd

+1

당신이 말하는 규칙은'foreach'에서 기본 컬렉션을 수정하는데 적용됩니다. 왜냐하면 'IEnumerator'를 무효로 할 것이기 때문입니다. 이 경우 기본 데이터는 컬렉션에 없지만 전달되는 파일 이름 스트림과 같습니다. 양자 택일로'GetFiles'를 사용했다면, 기본 콜렉션은 배열입니다. 그러나 당신은 삭제 된 배열을 수정하지 않을 것입니다. – juharr

+0

열거 중 목록에서 개체를 삭제하거나 이동하면 목록을 뒤로 이동해야합니다 (i = length - 1, i> = 0, i--). 문제는 색인 생성이 엉망인 항목을 제거 할 때입니다. 항목 2를 제거하면 항목 3이 2가되고 열거에서 항목 3을 건너 뜁니다. – jdweng

답변

1

예 이러한 열거 중에 현재 파일을 안전하게 삭제할 수 있습니다 (적어도 Windows의 경우). Directory.EnumerateFilesFindFirstFileFindNextFile winapi 호출을 통해 내부적으로 (Windows에서) 구현됩니다. 따라서 처음에는 FindFirstFile이 호출되고 각 반복기에서 (MoveNext()) - FindNextFile이 호출됩니다. 해당 호출간에 파일이 제거 된 경우 해당 API에서 문제가되지 않으므로 FindNextFile은 다음 일치하는 파일 만 반환합니다. 귀하의 경우 현재 파일을 삭제하므로 아무것도 건너 뛰지 않습니다. 열거의 중간에 새 파일이 추가 된 경우 포함 여부에 따라 파일 이름이 달라집니다. 이미 "b.txt"및 "c.txt"파일이 있고 "a.txt"파일이 추가되었다고 가정 해보십시오. 이러한 파일은 Directory.EnumerateFiles을 사용하여 포함시키지 않습니다. 이름이 "덜"(어떤 의미에서는) 이미 열거 된 파일이기 때문입니다. 반환 순서는 간단하지 않지만 (파일 시스템에 따라 다름) 아이디어를 얻었습니다.

+0

약간의 관련이 없음 : GetFiles가 다른 API 호출을 사용하는지, 즉 EnumerateFiles와 약간 다르게 동작하는지 여부를 알고 있습니까? 또는 GetFiles가 반환하기 전에 모두를 열거한다는 유일한 차이점은 무엇입니까? –

+1

@relatively_random yes GetFiles는 정확히 동일한 api를 사용합니다. 실제로,'GetFiles'는 기본적으로'return EnumerateFiles (path) .ToArray()'를 수행합니다. 그대로는 아니지만 같은 방법으로 실행됩니다. – Evk