2013-03-07 2 views
2

지금은 파일을 다른 디렉토리에 복사하는 기본 양식이 있습니다.어떤 버튼을 클릭했는지 확인하고 싶습니다.

catch 문에 '같은 이름의 파일이 이미 있습니다'라는 사례를 처리하고 싶습니다.

버튼을 통해 바꾸거나 유지할지 묻는 다른 창을 표시하여이 작업을 수행하고 싶습니다. 그런 다음

현재 코드를 클릭 된 버튼을 확인하는 경우 문을 사용하여 :

 catch (IOException x) 
      { 
       Copy copy = new Copy(); 
       copy.ShowDialog(); 
      } 

목표 :이 목적에 봉사 방법을 찾을 수 없습니다

 catch (IOException x) 
      { 
       Copy copy = new Copy(); 
       copy.ShowDialog(); 

        if (//Replace button was clicked) 
         do this 
        else if (//Keep button was clicked) 
         do this 
      } 

.

+2

나는 처리 할 수없는 예외에 대해 차라리 사용하려고합니다. 따라서 귀하의 경우 이미이 문제가 발생할 수 있다는 것을 알고 계시거나 파일이 이미 존재하는지 확인해야합니다. – Silvermind

+2

예 아니오 버튼이있는 간단한 MessageBox를 사용하지 않는 이유는 무엇입니까? (그리고 이런 종류의 결정을 처리하기 위해 예외를 사용하지 마십시오. 간단한 File.Exists가 문제를 해결해야합니다.) – Steve

답변

3

당신은 버튼을 클릭 할 때 복사 대화 상자가 DialogResult를 반환 할 수 있습니다 :

당신이 뭔가를 할 수 있습니다. 예를 들어 바꾸기 버튼에 DialogRsult.OK을 사용하고 유지 버튼에 DialogResult.Cancel을 사용할 수 있습니다. 이런 식으로 뭔가 :

당신에게 유사한 방법으로 Replace_Click 이벤트 핸들러 내에서 Keep_Click 이벤트 처리기에서 DialogResult.Cancel

this.DialogResult = DialogResult.OK; 
this.Close(); 

세트를이 설정할 수 있습니다 복사 대화 상자에서 바꾸기 단추를 클릭하면

0

Form.ShowDialog 메서드를 살펴 보았습니까? MSDN에서

http://msdn.microsoft.com/en-us/library/c7ykbedk.aspx

코드 발췌 :

public void ShowMyDialogBox() 
{ 
    Form2 testDialog = new Form2(); 

    // Show testDialog as a modal dialog and determine if DialogResult = OK. 
    if (testDialog.ShowDialog(this) == DialogResult.OK) 
    { 
     // Read the contents of testDialog's TextBox. 
     this.txtResult.Text = testDialog.TextBox1.Text; 
    } 
    else 
    { 
     this.txtResult.Text = "Cancelled"; 
    } 
    testDialog.Dispose(); 
} 
1

당신은 대신 DialogResult 클래스를 사용하는 것이 좋습니다.

catch (IOException x) 
{ 
    DialogResult dr = new DialogResult(); 
    dr.ShowDialog(); 

    if (dr == DialogResult.OK) 
     MessageBox.Show ("File replaced."); 

    else if (dr == DialogResult.Cancel) 
     MessageBox.Show ("File kept."); 
} 
1

이런 종류의 상황을 처리하기 위해 예외를 사용하지 마십시오. ations. 그냥 파일이 존재하는지 테스트하고 예 아니요 버튼 Mr Lippert says in this answer으로

sourceFile = "Your_Source_File_To_Copy"; 
string destFile = Path.Combine(destFolder, Path.GetFileName(sourceFile)); 
if(File.Exists(destFile)) 
{ 
    DialogResult dr = MessageBox.Show("File already exist! Do you wish to overwrite?", 
             "Warning!", 
             MessageBoxButtons.YesNo); 
    if(dr == DialogResult.Yes) 
     // Overwrite 
    else 
     // Do something else 
} 

와 간단한 메시지 박스를 사용
,

예외는 프로그램을 디버깅 거기에 도움이, 그 흐름을 제어 할 수 없습니다. 복사하기 전에 파일의 존재에 대한

+0

사실, 이것은 불행히도 흐름을 제어하기 위해 예외를 사용하는 것을 피할 수없는 상황입니다. 파일이 있는지 확인합니다. 좋아, 거기있어. 그런 다음 * 확인을 시도하고 파일을 열려고 시도하는 * 사이에 파일이 다른 프로세스에 의해 삭제됩니다. 당신은 예외를 얻습니다. 그곳에 있다고 가정하지만, 다른 프로세스에 의해 잠겨 있기 때문에 쓸 수는 없습니다 *. 당신은 예외를 얻습니다. "외인성 (exogenous)"예외는 외부 세계에 대한 일부 사실이 예상과 다름을 나타내며,이를 처리해야합니다. –

+0

링크 된 예제에서 예외는 외인성이 아니 었습니다. 예외가 던져 질지 미리 알 수 있으므로 피할 수 있으므로 처리 할 필요가 없습니다. 이러한 쾌적한 특성은 파일 시스템에는 해당되지 않습니다. –

+0

@EricLippert 물론 당신의 분석은 매우 정확합니다. 그러나 지금 당장 눈치 챘어야 할 것이 있습니다. 그러나 OP에서 사용한 패턴에 대한 제 의견은 여전히 ​​부정적입니다. 나는 Exception 안에서 그/그녀가 예외로 이끌어내는 동일한 행동을 반복하려한다고 느낍니다. 문제가 무기한 반복되지 않는다는 보장은 무엇입니까? – Steve

0

점검 :

if (File.Exists(destFileName)) 
    { 
     Copy copy = new Copy(); 
     System.Windows.Forms.DialogResult res = copy.ShowDialog(); 
     if (res == System.Windows.Forms.DialogResult.Yes) 
      File.Copy(sourceFileName, destFileName, true); 
    } 
    else 
    { 
     File.Copy(sourceFileName, destFileName); 
    } 

또한 적절하게 Copy 형태로 DialogResult 속성을 설정합니다.

0

아마 당신이 찾고있는 것이 당신 자신의 결과를 구현하는 것일 것입니다.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     var result = new Form2().ShowDialog(); 
     MessageBox.Show(result.ToString()); 
    } 
} 

public partial class Form2 : Form 
{ 

    ButtonResult buttonResult; 

    public Form2() 
    { 
     InitializeComponent(); 
    } 

    public new ButtonResult ShowDialog() 
    { 
     base.ShowDialog(); 
     return buttonResult; 
    } 

    private void KeepButton_Click(object sender, EventArgs e) 
    { 
     buttonResult = ButtonResult.Keep; 
     this.Close(); 
    } 

    private void ReplaceButton_Click(object sender, EventArgs e) 
    { 
     buttonResult = ButtonResult.Replace; 
     this.Close(); 
    } 
} 

public enum ButtonResult 
{ 
    None = 0, 
    Keep = 1, 
    Replace = 2, 
} 
관련 문제