2013-10-14 1 views
-1

파일 대화 상자에서 파일을 선택할 때 내 프로그램이 멈추는 문제가 있습니다. "반환 문자열 = minecraftFile.FileName,"나는 "만약"문과 사이에 아래로 문제가 좁혀했습니다DialogResult.OK에 적용중인 응용 프로그램

private void isForgeIncluded_btn_Click(object sender, EventArgs e) 
    { 
     this.isForgeIncluded.Text = FolderFileDialog("file", isForgeIncluded.Text, "Forge installer file (*.jar)|*.jar"); 
    } 

    public string FolderFileDialog(string type, string current, string fileTypes = "All files (*.*)|*.*|All files (*.*)|*.*", string StartFolder = "C:\\") 
     string ReturnString = current; 
     if (current != "") 
     { 
      StartFolder = Path.GetFullPath(current); 
     }    
     if (type == "file") 
     { 
      OpenFileDialog minecraftFile = new OpenFileDialog(); 
      minecraftFile.Title = "Select file"; 
      minecraftFile.InitialDirectory = StartFolder; 
      minecraftFile.RestoreDirectory = true; 

      minecraftFile.Filter = fileTypes; 
      if (minecraftFile.ShowDialog() == DialogResult.OK) 
      { 
       ReturnString = minecraftFile.FileName; 
       return ReturnString; 
      } 
      minecraftFile = null; 
     } 
     return ReturnString; 
    } 

:이 파일 브라우저 대화 상자를 보여주는 코드입니다 .. 디버거를 사용할 때 프로그램은 두 줄 사이에 5 초의 휴식을 취합니다. 휴식 후에 다시 돌아오고 아무 잘못이없는 것처럼 값을 반환합니다. 그러나 IntelliTrace는 프로그램에서 절대로 오류 메시지를 표시하지 않더라도 "FileNotFound Exception"을 표시하고 올바른 값을 텍스트 상자에 반환합니다.

wierd 부분은 항상 이런 일이 발생하지 않는다는 것입니다. 랜덤이며 마지막으로 동일한 파일을 선택하더라도 발생할 수 있습니다. 내가 선택한 파일은 시스템 드라이브의 로컬 파일입니다.

무엇이 잘못 될 수 있습니까? 코드가 정상적으로 보입니까?

+0

마지막 :'if (minecraftFile.ShowDialog() == DialogResult.OK) {' –

+0

탐색중인 파일/디렉토리가 로컬 디스크에 있습니까? – codemonkeh

+0

예 파일은 앞에서 설명한대로 로컬 파일입니다. –

답변

3

두 가지 기본적인 문제로 인해 OpenFileDialog에서 문제가 발생할 수 있습니다. 먼저 쉘 확장자가 컴퓨터에 설치되어 있으면 대화 상자를 열 때 프로세스에로드됩니다. 기본 점검은 메모장의 파일 + 열기 명령에 문제가 발생하지 않으며 대화 상자가 활성화되어있는 동안 Visual Studio 출력 창에 특별한 내용이 표시되지 않는다는 것입니다. 관리되지 않는 디버깅을 사용하면 더 많은 정보를 얻을 수 있습니다.

두 번째 원인은 UI 스레드의 스레드 상태에 문제가 있습니다. 이 대화 상자를 제대로 표시하려면 단일 스레드 아파트로 초기화해야합니다. 일반적으로 Program.cs의 Main() 메서드로 돌아가서 [STAThread] 특성이 있는지 확인하십시오.

그렇다면 우리는 오작동하는 코드에 대해 더 많은 정보가 필요합니다. 관리되지 않는 디버깅 인 Project + Properties, Debug 탭을 활성화해야합니다. 그리고 Microsoft 기호 서버, 도구 + 옵션, 디버깅, 기호를 활성화하십시오. 그리고 그냥 내 코드 디버깅, 도구 + 옵션, 디버깅, 일반을 해제하십시오. Debug Stack + Break를 누르십시오. Call Stack 윈도우의 내용을 오동작하고 게시 할 수있게되면 바로 모든 것을 누르십시오.

+0

내 결론은 일부 셸 확장이어야한다는 것입니다. 비록 내 노트북과 기본 PC 모두에서 그걸로, 아무 생각을 가지고 .. 메모장과 팁은 메모장에서 일어나는 것처럼 내 코드가 아니라는 것을 증명했다. 그러나 직장에서 내 PC에 아무런 문제가 없습니다. 팁 주셔서 감사! 이것은 다른 사람들에게 유용 할 수 있습니다! –

+0

SysInternals Autoruns 유틸리티를 사용하여 셸 확장을 사용하지 않도록 설정하십시오. –

관련 문제