2013-01-22 4 views
2

내 Windows 응용 프로그램에 SaveFileDialog를 추가하려고하는데 여러 줄 텍스트 상자의 내용에서 간단한 텍스트 파일을 저장합니다. 이 프로그램은 저장 대화 상자까지 정상적으로 작동하는 것으로 보이지만 오류가 발생하지는 않습니다. 일단 저장 버튼을 클릭하면 응용 프로그램이 멈 춥니 다. 유일한 방법은 "stop-debugging"버튼을 클릭하는 것입니다. 여기에 내가 시도 코드 부분이 있지만, 모두 같은이 중단 만들 : 즉 (내가 C#을하지만, C++를 사용하지 않지만C#을 사용하여 TEXT 파일 작성

private void button_SaveToFile_Click(object sender, EventArgs e) 
    { 
     SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 
     saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";    
     saveFileDialog1.RestoreDirectory = true; 

     if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
       File.WriteAllText(saveFileDialog1.FileName, textBox_ListDestination.Text); 
     }    
    } 

private void button_SaveToFile_Click(object sender, EventArgs e) 
    { 
     Stream myStream; 
     SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 

     saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; 
     saveFileDialog1.FilterIndex = 2; 
     saveFileDialog1.RestoreDirectory = true; 

     if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      if ((myStream = saveFileDialog1.OpenFile()) != null) 
      { 
       File.WriteAllText(saveFileDialog1.FileName, textBox_ListDestination.Text); 
       myStream.Close(); 
      } 
     } 
    } 
+1

코드를 단계별로 실행하면 어떤 행이 멈추게됩니까? –

+1

멈출 때 Ctrl + Alt + Break를 눌러 다른 방법이 있습니다. 이 줄은 문제라고 생각합니다. if ((myStream = saveFileDialog1.OpenFile())! = null)'- 그'if '조건을 제거하십시오. –

+0

어떻게 코드를 단계별로 실행합니까? 죄송합니다 .. 여기에서 배우십시오. 방금 다시 테스트했는데 약 1 ~ 2 분 정도 걸린 다음 다시 정상으로 돌아가는 것으로 보입니다. 텍스트 파일은 10Kb를 넘어서는 안됩니다. – Jeagr

답변

3

Jeagr,

나는 문제가 없습니다. 추측하면 디버깅시 여러 번 시도한 메모리 할당 (관리되지 않는 리소스 사용)에 문제가있을 수 있으며 같은 파일에 여러 번 다시 저장하면 파일 포인터가 잘못되었을 수 있습니다.

두 번째 예는 작동하지 않습니다. File.WriteAllText를 호출하면 파일이 열리고 자동으로 파일이 쓰여지고 닫힙니다. (여기에 읽으십시오 : http://msdn.microsoft.com/en-us/library/system.io.file.writealltext.aspx)

당신이 OpenFile를 부를 경우, 당신은 그 파일에 자물쇠를두고 있습니다. 코드에서 File.WriteAllText가 실행될 때 파일이 이미 사용 중이므로 파일이 폭발합니다. OpenFile을 사용하여 파일 작업을하려면 파일 작업 방법을 변경해야합니다. 다음은 예제입니다. http://msdn.microsoft.com/en-us/library/system.windows.forms.savefiledialog.openfile(v=VS.71).aspx 예제에서 파일을 닫는 방법에 유의하십시오. 파일에서 작업하고 싶다면 CloseFile 메서드가 호출되기 전에 해당 코드를 코딩해야합니다.

OpenFile을 사용하여 파일 작업하는 방법에 대한 예제가 필요하다면 인터넷에 몇 가지 예제가 있어야하지만 필요에 따라 File.WriteAllText가 작동한다고 생각합니다.

첫 번째 예로 돌아갑니다.

디버깅 중에 코드를 여러 번 치는 경우 내 제안은 SaveFileDialog를 'using'문으로 묶는 것입니다. 이것은 시스템 걸기 및 일부 디버깅에 도움이 될 수 있습니다.

private void button1_Click(object sender, EventArgs e) 
    { 
     using (var sfd = new SaveFileDialog()) 
     { 
      sfd.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; 
      sfd.FilterIndex = 2; 

      if (sfd.ShowDialog() == DialogResult.OK) 
      { 
       File.WriteAllText(sfd.FileName, textBox_ListDestination.Text); 
      }  
     } 
    } 
1

, 나는이 문제가 없었 대화 나타납니다). 전체 OPENFILENAME 구조를 제로로 해결 한 다음 필요한 멤버 만 채우기 만하면됩니다. 실제로 공통 대화 상자를 호출하기 전에 구조를 초기화하지 않는 것이 인쇄 대화 상자의 문제였습니다. 내가 첫 번째 예제 코드를 사용하여 문제를 재현 할 때

0

이 코드가 작동하려면 다음 코드를 사용하십시오. 코드 "ShowHelp = true"가 문제를 해결 한 후 약간의 최적화가 다음 솔루션으로 이어졌습니다.

private static void SaveToFile(string List) 
{ 
    var saveFileDialog1 = new SaveFileDialog 
    { 
     InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal), 
     Filter = string.Format("{0}Text files (*.txt)|*.txt|All files (*.*)|*.*", "ARG0"), 
     RestoreDirectory = true, 
     ShowHelp = true, 
     CheckFileExists = false 
    }; 
    if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
     File.WriteAllText(saveFileDialog1.FileName, keywordList); 
}