2012-02-03 2 views
0

Windows 7에서 응용 프로그램을 만들고 있습니다. 파일 저장 위치를 ​​사용자가 선택할 수 있도록 SaveFileDialog를 사용합니다.SaveFileDialog .net - 읽기 전용 파일 덮어 쓰기

Windows 7에서는 읽기 전용 파일을 선택하고 덮어 쓰려고하면 위선적 인 말을하는 팝업이 나타납니다. 덮어 쓰거나 다른 저장을 만들기 위해 다른 파일을 선택해야합니다.

문제점은 Windows XP에서는 팝업 메시지가 나타나지 않는다는 것입니다. 대신 프로그램은 예외를 throw합니다.

SaveFileDialog fldg = new SaveFileDialog(); 
      fldg.Title = "Save File"; 
      fldg.InitialDirectory = @"c:\"; 
      fldg.Filter = "(*.xml)|*.xml"; 
      fldg.FilterIndex = 2; 
      fldg.RestoreDirectory = true; 

     string path = ""; 

      if (fldg.ShowDialog() == DialogResult.OK) 
      { 
       path = fldg.FileName; 
      } 

파일 만 그렇다면 읽을 경우, 확인 (XP에서) 동일한 메시지를 표시하는 방법이있다 :

************** Exception Text ************** 
System.UnauthorizedAccessException: Access to the path 'C:\spanish.xml' is denied. 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath) 
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) 
    at System.Xml.XmlWriterSettings.CreateWriter(String outputFileName) 
    at System.Xml.XmlWriter.Create(String outputFileName, XmlWriterSettings settings) 
    at TOOL.XMLExporter.export(TabControl& languageTabs, ProgressBar& progressBar1, Int32 selectedLanguage) 
    at TOOL.Main.exportToXML() 
    at TOOL.Main.toxmlToolStripMenuItem_Click(Object sender, EventArgs e) 
    at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e) 
    at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e) 
    at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e) 
    at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e) 
    at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met) 
    at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met) 
    at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea) 
    at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea) 
    at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
    at System.Windows.Forms.ToolStrip.WndProc(Message& m) 
    at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

이 내가 전화 코드입니다. 다시

+0

그리고 의도 한 동작은 무엇입니까? – okrumnow

+0

@okrumnow "파일이 읽기 전용인지 확인하는 방법이 있습니까? 그렇다면 같은 메시지를 표시하십시오 (xp)." – maffo

답변

4

전화의 SaveFileDialog :

bool foundFile = false; 
SaveFileDialog dlg = new SaveFileDialog(); 

while (!foundFile) 
{ 
    if (dlg.ShowDialog() != DialogResult.OK) 
     break; 

    FileInfo info = new FileInfo(dlg.FileName); 
    if (!info.IsReadOnly) 
    { 
      MessageBox.Show("File is readonly.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    else 
    { 
      foundFile = true; 
    } 
}  

파일은 읽기 전용?

FileInfo info = new FileInfo(filename); 
if(info.IsReadOnly) 
{ 
    ... 
} 
+0

새 파일을 만드는 경우에도이 작업이 가능합니까? 나는 파일 이름을 모은다. 그게 아니라면? – maffo

+0

.IsReadOnly가 없으면 true를 반환합니다. (당신도 이것을 .Exists로 확인할 수 있습니다.) – Hubi

+0

다른 하나의 문제는 대화 상자를 닫기 위해 필요한 '파일 이름'을 얻는 것입니다. 그러나 결코 예외가 던져지기 때문에 결코 실행되지 않습니다. – maffo