닷넷으로 오픈다이얼로그 박스를 이용한 다중 선택하여 1000개 이상의 파일을 가져오는 경우 XP에서 오류가 발생 되는걸 확인 (windows 7 64bit에서는 오류 없음)

그러나 델파이(정확히는  Lazarus)에서는 오류가 발생되지 않은것으로 보아 닷넷프레임워크나 CLR에서 오류가 발생되는것으로 판단되어 짐

역시 구글링으로 인한 해결 방법을 찾았으나 이것은 오류가 발생시 해당 폴더 전체 파일리스트를 가져오게끔 예외 처리를 하였음

그럼 소스 참고하시기 바랍니다.

 

출처 : http://stackoverflow.com/questions/2607596/how-get-file-names-using-openfiledialog-in-net-1000-file-multiselect

public static string[] GetFiles() 
   
{ 
       
string[] fileNames; 
       
OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
 
        openFileDialog1
.InitialDirectory = UniversalDataImporter.Properties.Settings.Default.openFilePath; 
        openFileDialog1
.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; 
        openFileDialog1
.FilterIndex = 2; 
        openFileDialog1
.RestoreDirectory = false; 
        openFileDialog1
.Multiselect = true; 
        openFileDialog1
.CheckFileExists = false; 
 
       
try 
       
{ 
           
DialogResult result = openFileDialog1.ShowDialog(); 
           
if (result == DialogResult.OK && openFileDialog1.FileNames.Count() <501 ) 
           
{ 
               
UniversalDataImporter.Properties.Settings.Default.openFilePath = 
                   
Path.GetDirectoryName(openFileDialog1.FileName); 
               
UniversalDataImporter.Properties.Settings.Default.Save(); 
               
return fileNames = openFileDialog1.FileNames; 
           
} 
           
else if (result == DialogResult.Cancel) 
           
{ 
               
return null; 
           
} 
           
else 
           
{ 
               
if (MessageBox.Show("Too many files were Selected. Would you like to import a folder instead?", 
                   
"Too many files...", MessageBoxButtons.YesNo) == DialogResult.Yes) 
               
{ 
                   
return fileNames = GetFilesInFolder(); 
               
} 
               
else 
               
{ 
                   
return null; 
               
} 
           
} 
       
} 
       
catch (Exception ex) 
       
{ 
           
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 
           
return null; 
       
} 
   
} 
 
   
public static string[] GetFilesInFolder() 
   
{ 
 
       
FileInfo[] fileInfo; 
 
       
string pathName; 
       
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog(); 
 
        folderBrowserDialog
.RootFolder = System.Environment.SpecialFolder.Desktop; 
 
       
DialogResult results = folderBrowserDialog.ShowDialog(); 
 
       
if (results == DialogResult.OK) 
       
{ 
           
try 
           
{ 
                pathName
= folderBrowserDialog.SelectedPath; 
 
               
DirectoryInfo dir = new DirectoryInfo(pathName); 
               
if (dir.Exists) 
               
{ 
 
                    fileInfo
= dir.GetFiles(); 
 
                   
string[] fileNames = new string[fileInfo.Length]; 
 
                   
for (int i = 0; i < fileInfo.Length; i++)//this is shit 
                   
{ 
                        fileNames
[i] = fileInfo[i].FullName; 
                   
} 
 
                   
return fileNames; 
               
} 
               
else 
               
{ 
                   
return null; 
               
} 
 
 
           
} 
           
catch (Exception ex) 
           
{ 
               
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 
               
return null; 
           
} 
 
       
} 
       
else if (results == DialogResult.Cancel)  
       
{ 
           
return null; 
       
} 
       
else { return null; } 
   
} 


 

이 글은 스프링노트에서 작성되었습니다.

 

C#에서 현재 경로를 알아내는 방법은 여러가지가 있다.

1. System.Environment.CurrentDirectory

가장 쉽게 현재 실행 경로를 알아낼 수 있는 방법이다. 하지만 이 방법은 Register에 등록된 프로그램으로 실행되면 다른 값을 출력한다. 이때는 3번 Application.StartupPath를 이용해야 한다.

* 루트일 경우에는 ‘\’ 반환, 그 외의 경우에는 폴더명까지만 반환한다.

  • C:\
  • C:\TestFolder\MyApp


2. System.IO.Directory.GetCurrentDirectory()


1번과 동일하다.


3. Application.StartupPath

위의 Register에 등록되었을 때도 정상적으로 자신의 시작 경로를 반환한다. 하지만 이는 Window Forms를 사용할 때만 Application 클래스를 사용할 수 있기 때문에 Console 기반 혹은, 클래스 라이브러리 기반에서는 사용이 불가능하다.

Tip. Application.ExecutablePath
현재 실행된 어플리케이션의 실행 파일의 위치이다. C:\Test\App.exe 와 같이 출력된다. 이 정보는 현재 경로가 아니기 때문에 변경되지 않는다.

 

 출처 : http://pureholic.net/2010/04/how-to-kwow-startpath-in-csharp/

이 글은 스프링노트에서 작성되었습니다.

+ Recent posts