2010-06-10 4 views
1

SharePoint 파일 가져 오기에 대해 내 프로그램 목록에 "잘못된 문자"가있는 파일의 이름을 바꾸려고합니다. 내가 말한 불법 문자는 ~ # % & * {}/\ | : <>? - ""RegEx 및 재귀를 사용하여 FileNames 변경

드라이브를 통해 반복적으로 파일 이름 목록을 수집 한 다음 정규식을 통해 목록에서 파일 이름을 선택하고 실제 파일 이름에서 유효하지 않은 문자를 대체하려고합니다. 그들 자신.

아무도이 작업을 수행하는 방법을 알고 있습니까? 지금까지 나는이있다 : (i가이 물건에 대한 완전한 n00b 해요, 기억하시기 바랍니다)

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] files = Directory.GetFiles(@"C:\Documents and Settings\bob.smith\Desktop\~Test Folder for [SharePoint] %testing", "*.*", SearchOption.AllDirectories); 
     foreach (string file in files) 
     { 
      Console.Write(file + "\r\n"); 


     } 
     Console.WriteLine("Press any key to continue..."); 
     Console.ReadKey(true); 



     string pattern = " *[\\~#%&*{}/:<>?|\"-]+ *"; 
     string replacement = " "; 
     Regex regEx = new Regex(pattern); 

     string[] fileDrive = Directory.GetFiles(@"C:\Documents and Settings\bob.smith\Desktop\~Test Folder for [SharePoint] %testing", "*.*", SearchOption.AllDirectories); 
     StreamWriter sw = new StreamWriter(@"C:\Documents and Settings\bob.smith\Desktop\~Test Folder for [SharePoint] %testing\File_Renames.txt"); 
     foreach(string fileNames in fileDrive) 
     { 

     string sanitized = regEx.Replace(fileNames, replacement); 
     sw.Write(sanitized + "\r\n"); 
     } 
     sw.Close(); 



    } 






} 

을 내가 알아 내기 위해 필요한 반복적으로, 이러한 잘못된 문자를 검색 실제 파일 이름에 장착하는 방법입니다 그 자체. 아무도 아이디어가 없나요?

+0

나는 그가 단지 그들을 찢어 버리는 것을 의미한다고 생각한다. – slf

+0

정규 표현식은 당신이 원하는 것을한다? – slf

답변

1

파일과 디렉터리를 사용하여 반복적으로 작업 할 때 많은 경우에 DirectoryInfo 클래스를 사용하는 것이 쉬우 며 정적 메서드 대신 멤버입니다. 미리 빌드 된 트리 구조가 있으므로 직접 관리 할 필요가 없습니다.

GetDirectoriesGetFilesFileInfo 개체를 반환하는 동안 트리를 걸을 수 있도록 더 많은 DirectoryInfo 인스턴스를 반환합니다.

이 사람 created a custom iterator은 재귀 적으로 파일 정보를 생성합니다. 기존의 정규식 작업과 결합하면 솔루션을 완성 할 수 있습니다.

+0

맞춤 반복기 링크를 살펴 보았습니다. 어디서 드릴까요? – yeahumok

+0

'GetFilesRecursive (dirInfo);'- 그냥 루트 dirInfo를 전달한다. – slf

1

File.Move()는 파일의 이름을 효과적으로 바꿉니다. 기본적으로 후자의 루프 안에

File.Move(fileNames, sanitized); 

이 필요합니다.

ALERT - 당신이 sanitized 변수의 말에 카운터를 추가하는 것처럼,이를 방지하기위한 정책을 수립해야 할 것이다, 그래서 아마도, 중복 된 파일 이름이있을 수 있습니다. 또한 적절한 예외 처리를 적용하십시오.

추신 : 물론, :\*과 같은 문자는 검색 할 필요가 없습니다.

+0

if/else 문을 여기에 넣어야합니까? 파일에 잘못된 문자가 없으면 자동으로 건너 뜁니다. – yeahumok

+0

@yeahumok,'FileNames'와'sanitized'를 비교해 불필요한'File.Move()'호출을 피할 수 있습니다. 그러나,'# File.txt'와'~ File.txt'는 이름이'File.txt'와 같은 중복 파일에주의를 기울여서 액세스 권한, 디스크 공간 및 기타 IO 예외를 확인하십시오. – Humberto

관련 문제