숨겨진 파일을 제외한 파일 목록 가져 오기
Directory.GetFiles()숨겨진 것으로 표시된 파일을 포함하여 모든 파일을 반환합니다. 숨겨진 파일을 제외하는 파일 목록을 얻는 방법이 있습니까?
이것은 당신을 위해 작동합니다.
DirectoryInfo directory = new DirectoryInfo(@"C:\temp");
FileInfo[] files = directory.GetFiles();
var filtered = files.Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden));
foreach (var f in filtered)
{
Debug.WriteLine(f);
}
// check whether a file is hidden
bool isHidden = ((File.GetAttributes(filePath) & FileAttributes.Hidden) == FileAttributes.Hidden);
.NET 4.0 및 Directory.EnumerateDirectories를 사용하면 다음 구문을 사용할 수 있습니다.
var hiddenFilesQuery = from file in Directory.EnumerateDirectories(@"c:\temp")
let info = new FileInfo(file)
where (info.Attributes & FileAttributes.Hidden) == 0
select file;
이것은 Directory.EnumerateDirectories가 조금 더 게으른 것을 제외하고는 기본적으로 다른 답변과 동일합니다. 그러나 모든 것을 열거하는 경우에는 그다지 유용하지 않습니다.
(쿼리를 더 쉽게 읽을 수 있도록 여기에 있습니다).
사용하는 경우 :
var filtered = files.Select(f => f) .Where(f => (f.Attributes & FileAttributes.Hidden) == 0);
이것은 숨겨진 파일을 찾지 못하므로 다음을 사용할 수 있습니다.
var filtered = files.Select(f => f) .Where(f => (f.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden);
이것은 숨겨진 파일을 읽는 것입니다.
한 줄 코드 :
FileInfo[] tmpFiles = tempDir.GetFiles().Where(file =>
(file.Attributes & FileAttributes.Hidden) == 0).ToArray();
SearchOption.TopDirectoryOnly를 사용하는 경우 상대적으로 간단하지만 SearchOption.AllDirectories를 사용하여 모든 파일을 재귀 적으로 나열하려는 경우 훨씬 더 복잡해집니다. GetFiles를 사용할 수 있다면 읽기 전용으로 필터링 할 수 있지만 안타깝게도 숨겨진 것으로 표시된 디렉토리에서는 작동하지 않습니다. 해당 폴더 아래의 파일도 나열되지만 디렉토리와 달리 숨겨지지는 않습니다.
GetDirectories도 사용할 수 있지만 다시-SearchOption.AllDirectories를 사용하여 모든 항목을 재귀 적으로 나열 할 수는 없습니다. 숨겨진 폴더 아래에있는 폴더도 나열하지만 해당 폴더에는 숨겨진 속성이 활성화되어 있지 않기 때문입니다.
이것은 적어도 Tortoise svn .svn 숨겨진 폴더의 경우입니다. 숨겨지지 않은 많은 폴더가 포함되어 있지만 .svn은 숨겨져 있습니다. 마지막으로 다음과 같은 함수를 작성했습니다.
SearchOption sopt = SearchOption.AllDirectories;
List<String> listFiles = new List<string>();
List<DirectoryInfo> dirs2scan = new List<DirectoryInfo>();
dirs2scan.Add(new DirectoryInfo(fromPath) );
for( ; dirs2scan.Count != 0; )
{
int scanIndex = dirs2scan.Count - 1; // Try to preserve somehow alphabetic order which GetFiles returns
// by scanning though last directory.
FileInfo[] filesInfo = dirs2scan[scanIndex].GetFiles(pattern, SearchOption.TopDirectoryOnly);
foreach (FileInfo fi in filesInfo)
{
if (bNoHidden && fi.Attributes.HasFlag(FileAttributes.Hidden))
continue;
listFiles.Add(fi.FullName);
}
if( sopt != SearchOption.AllDirectories )
break;
foreach (DirectoryInfo dir in dirs2scan[scanIndex].GetDirectories("*", SearchOption.TopDirectoryOnly))
{
if (bNoHidden && dir.Attributes.HasFlag(FileAttributes.Hidden))
continue;
dirs2scan.Add(dir);
}
dirs2scan.RemoveAt(scanIndex);
}
sopt can be used a parameter in function if necessary or removed if not needed.
I actually rather like passing a function parameter to a method which does what I want it to. I have a SearchDirectory method, which forms the basis for most of the calls I use:
private void SearchDirectory(DirectoryInfo startDirectory,
string pattern,
Action<FileInfo> act)
{
foreach (var file in startDirectory.GetFiles(pattern))
act(file);
foreach (var directory in startDirectory.GetDirectories())
SearchDirectory(directory, pattern, act);
}
private List<FileInfo> SearchDirectory(DirectoryInfo startDirectory,
string pattern,
Func<FileInfo, bool> isWanted)
{
var lst = new List<FileInfo>();
SearchDirectory(startDirectory,
pattern,
(fi) => { if (isWanted(fi)) lst.Add(fi); });
return lst;
}
Then you can use the other solutions listed to write an IsHidden function which takes a single FileInfo, and returns true if so:
private bool IsHiddenDirectory(DirectoryInfo d) {
if (d == null) return false;
if (d.Attributes.HasFlag(FileAttributes.Hidden))) return true;
if (d.Parent == null) return false;
return IsHiddenDirectory(d.Parent);
}
private bool IsHidden(FileInfo fi) {
if ((fi.Attributes & FileAttributes.Hidden) != 0) return true;
// If you're worried about parent directories hidden:
return IsHiddenDirectory(fi.Directory);
// otherwise:
return false;
}
Then I can call it in another method pretty easily:
var files = SearchDirectory(new DirectoryInfo("C:\temp\"),
"*.xml",
(fi) => { return !IsHidden(fi); );
static bool IsHidden(string p)
{
return p.Contains("Hidden");
}
DirectoryInfo directory = new DirectoryInfo(@"C:\temp");
FileInfo[] files = directory.GetFiles();
var filtered = files.Where(f => !IsHidden(File.GetAttributes(f).ToString()));
foreach (var f in filtered)
{
Debug.WriteLine(f);
}
Steps:
Create bool that returns true when string contains 'Hidden' ----
static bool IsHidden(string p){return p.Contains("Hidden");}get directory info ----
DirectoryInfo directory = new DirectoryInfo(@"C:\temp");get file info array from directory ----
FileInfo[] files = directory.GetFiles();get file info Attributes and convert into string from file info array and check it contains 'Hidden' or not ----
var filtered = files.Where(f=>!IsHidden(File.GetAttributes(f).ToString()));
'IT TIP' 카테고리의 다른 글
| LINQPad는 다른 클래스 (예 : LINQ in Action 샘플의 Books)를 어떻게 참조합니까? (0) | 2020.11.20 |
|---|---|
| Visual Studio : 프로세스가 생성 될 때 프로세스에 자동 연결 (0) | 2020.11.20 |
| 모든 SQL Server 외래 키에 일치하는 인덱스가 있어야합니까? (0) | 2020.11.20 |
| 작은 따옴표 만 이스케이프하려면 어떻게합니까? (0) | 2020.11.20 |
| 매개 변수가 bash 스크립트에 제공되었는지 확인하는 방법 (0) | 2020.11.20 |