SaveFileDialog .net - перезапись файлов только для чтения - PullRequest
0 голосов
/ 03 февраля 2012

Я создаю appliction в Windows 7. Я использую SaveFileDialog, чтобы позволить пользователю выбирать, куда сохранять файлы.

В Windows 7, если вы выбираете файл только для чтения и пытаетесь перезаписать, вы получите всплывающее окно с сообщением, что вы не можете. Затем вам нужно выбрать другой файл для перезаписи или просто создать новое сохранение.

Проблема, с которой я столкнулся, заключается в том, что в Windows 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)

Это код, который я звоню:

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).

1 Ответ

4 голосов
/ 03 февраля 2012

Вызовите 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)
{
   ...
}
...