2016-06-17 1 views
0

여러 경로의 파일을 사용하는 프로그램 (C#, .Net 4.5, WPF)이 있습니다. 사용자가 해당 파일 유형의 위치를 ​​탐색 할 수있게하기 위해 각각의 OpenFileDialog를 인스턴스화하여 각 파일이 마지막으로 사용한 디렉토리를 별도로 추적 할 수 있기를 바랍니다.openfiledialogs 간섭 및 디렉토리가 지속됩니다.

//Class variables 
OpenFileDialog wordFileDlg = new OpenFileDialog(); 
OpenFileDialog excelFileDlg = new OpenFileDialog(); 
Dictionary<FILETYPES, OpenFileDialog> fdialogs = new Dictionary<FILETYPES, OpenFileDialog>(); 

//from Main 
wordFileDlg.FilterIndex = 2; 
wordFileDlg.RestoreDirectory = true; 
wordFileDlg.Title = "Choose Word Document Template"; 
wordFileDlg.Filter = "All files (*.docx)|*.docx"; 

excelFileDlg.FilterIndex = 2; 
excelFileDlg.RestoreDirectory = true; 
excelFileDlg.Title = "Choose Excel or XML Data File"; 
excelFileDlg.Filter = "All files (*.xls*;*.xml)|*.xls*;*.xml"; 

wordFileDlg.InitialDirectory = @"d:\downloads-tmp\"; 
excelFileDlg.InitialDirectory = @"D:\Document\Spreadsheets"; 

fdialogs[FILETYPES.WORD] = wordFileDlg; 
fdialogs[FILETYPES.EXCEL] = excelFileDlg; 
//... End Main 


private string browseForFile(FILETYPES filetype, out string result) 
{ 
    Trace.WriteLine("Using OpenFileDialog with initial dir = " + fdialogs[filetype].InitialDirectory); 
    DialogResult dr; 

    dr = fdialogs[filetype].ShowDialog(); 
    result = dr.ToString(); 
    Trace.WriteLine("Dialog result dr= " + dr.ToString()+", type of dr = "); 
    if (!dr.ToString().Equals("Cancel")) 
    { 
     clearWarning(); 
    } 
    return fdialogs[filetype].FileName; 
} 

이것은 간헐적으로 작동하는 것 같습니다. 가끔 한 파일 대화 상자 (wordFileDlg)에서 파일을 선택하면 다음에 다른 파일 대화 상자 (excelFileDlg)를 열 때 디렉토리가 wordFileDlg의 마지막으로 선택한 디렉토리로 변경됩니다. 다른 방법은 사실이 아닙니다. 왜 그렇게했을까요?

초기 디렉터리 속성을 기본값으로 설정했지만 마지막 디렉터리까지도 세션간에 유지되는 것으로 보입니다. restoreDirectory 속성을 false로 설정합니다. 프로그램을 열고 일부 파일을 찾아서 프로그램을 닫습니다. 프로그램을 다시 열면 찾아보기가 처음 디렉토리로 이동하지 않고 마지막으로 선택한 디렉토리로 이동합니다. 그것은 어떻게 알 수 있습니까? 파일 대화 상자를 특정 디렉토리에 열 수있는 방법을 찾지 못하는 것 같습니다. 나는 RestoreDirectory를 true와 false로 설정하려고 시도했다.

다른 파일 대화 상자에서 각각의 디렉토리를 기억하고 세션간에 유지하지 않고 어떻게 열 수 있습니까?

+0

수 없습니다. 당신은 사용자가 같은 위치에서 다음 파일을 열길 원할 것으로 추정하고 싶은 OS와 싸우고있다. 이 논쟁에서 이기지 못할 것입니다. –

+0

두 개의 대화 상자가 서로 다른 폴더에서 열리기 때문에 다른 대화 상자가 여기에서 진행됩니다. 누군가 내가 서브 클래 싱 할 수 있거나이 기능을 가진 오픈 소스 파일 브라우저 클래스를 만들었습니까? – Matt

답변

0

나는 그것이 오래된 질문이라는 것을 알고 있지만 비슷한 (비록 더 간단 함에도 불구하고) 문제를 직접 발견했습니다.

정말 원하는 것을 얻을 수는 없지만 이동해야하는 디렉토리를 저장하는 데 사용할 문자열 변수를 사용하는 것은 쉽습니다. 당신은 그것을 클래스로 요약 할 수 있습니다. 그리고 당신이 필요로하는 것이 있습니다.

여기 내 클래스의 :

public class PersistentOpenFileDialog 
{ 
    OpenFileDialog m_ofd = new OpenFileDialog(); 
    string m_persistentDirectory = null; 

    public PersistentOpenFileDialog() 
    { 
     m_ofd.CheckFileExists = true; 
     m_ofd.CheckPathExists = true; 
     m_ofd.ReadOnlyChecked = true; 
    } 

    public bool? ShowDialog() 
    { 
     if (m_persistentDirectory != null) 
     { 
      m_ofd.InitialDirectory = m_persistentDirectory; 
     } 
     bool? retval = m_ofd.ShowDialog(); 
     if (retval == true) 
     { 
      m_persistentDirectory = new FileInfo(FileName).DirectoryName; 
     } 

     return retval; 
    } 

    public string FileName 
    { 
     get { return m_ofd.FileName; } 
     set { m_ofd.FileName = value; } 
    } 
} 

그것은 매우 기본적인 - 그것은 단지 방법과 나는 엄격하게 필요한 속성을 장식하지만, 쉽게 누락 된 것을 추가 할 수 있습니다.

이 클래스는 동일한 인스턴스의 다른 ShowDialog()에 걸쳐 마지막 디렉토리가 유지되도록합니다. 그러나 프로그램을 종료 할 때 모든 것이 사라지고 다음에 실행할 때 OS가 결정합니다. 파일이나 시스템 레지스트리와의 직렬화/직렬화를 통해 디렉토리를 더욱 영구적으로 만드는 것이 좋습니다.