2011-09-14 5 views
2

사용자가 서버에 파일을 업로드 할 수있는 asp.net 프로젝트로 작업하고 있습니다. 파일을 원래 이름으로 저장하려고하지만 같은 이름의 파일이 이미있는 경우 어떻게해야합니까? Windows와 같이 괄호 안에 숫자가있는 파일 이름을 생성하려면 어떻게합니까?괄호 안에 숫자가있는 파일 이름 생성

파일은 특정 폴더에 업로드되고 클라이언트 쪽 이름과 함께 저장됩니다. 따라서 myimage.jpg라는 파일이 업로드되고 서버에 이미 같은 이름의 파일이있는 경우 myimage (1) .jpg로 이름을 바꾸거나 'myimage.jpg'에서 'myimage (n) .jpg'로 변경해야합니다. '이 (가) 존재하면 myimage (n + 1) .jpg로 이름을 바꿔야합니다.

이러한 파일 이름을 검색하고 생성하는 가장 좋은 방법은 무엇입니까? 내 첫 번째 추측은 DirectoryInfo.EnumerateFiles() 이상의 정규식으로 linq를 사용하는 것이지만 좋은 접근 방법입니까?

+0

여러 가지 방법이 있습니다. 너 뭐 해봤 니? –

+0

Mine은 (와일드 카드) 패턴 파일 이름 (*) .ext가있는 파일을 선택하고 파일 이름의 괄호 안에있는 max (number)를 반환하기 위해 약간 못 생겼습니다. –

답변

2
public static object lockObject = new object(); 
void UploadFile(...) 
{ 
    //-- other code 
    lock (lockObject) 
    { 
     int i = 1; 
     string saveFileAs = "MyFile.txt"; 
     while (File.Exists(saveFileAs)) 
     { 
      string fileNameWithoutExt = Path.GetFileNameWithoutExtension(saveFileAs); 
      string ext = Path.GetExtension(saveFileAs) 
      saveFileAs = String.Concat(fileNameWithoutExt, "(", i.ToString(), ")", ext); 
      i++; 
     } 

     //-- Now you can save the file. 
    } 
} 
+4

이것은 asp.net에 있습니다 - 즉, 같은 논리를 실행하는 여러 스레드가 있음을 의미합니다. 존재 확인과 파일 저장은 원자 적이어야합니다. – Codism

+0

위대한 요점은, 나는 대답을 업데이 트했습니다. 그것은 또한 내 프로젝트에서이 문제에 취약한 부분을 찾는데 도움이되었습니다. –

+1

코드가 서버 팜에서 실행되는 경우 잠금은 파일 시스템이나 데이터베이스와 같은 전역 작업을 통해 수행되어야합니다. – Codism

0

LINQ 또는 정규식이 필요하지 않습니다.

원본 파일 이름이있는 경우 이름에 (1)을 추가하십시오.
(있는 경우) 원래 이름에 (2)을 추가하십시오.
등등 ...

5

원본 이름이 동일한 파일을 업로드 날짜/시간순으로 정렬하지 않아도된다면 System.Guid.NewGuid()를 ToString()에 추가하면됩니다. 파일 이름.

+0

GUID의 유용성을 절대로 과소 평가하지 마십시오. – Earlz

+0

아주 추악한 파일 이름이됩니다. – SLaks

+0

@ SLaks : 사실. 그러나 WhoaCoolPic (1357) .jpg는별로 좋지 않습니다 .-) –

관련 문제