SaveFileDialog не удается вернуть в Windows XP - PullRequest
2 голосов
/ 13 декабря 2011

Я работаю с winforms в Windows 7, использую C # в Visual Studio 2010. В настоящее время в Windows 7 и из установки, и из отладчика работает приведенный ниже код.Однако, когда программа установлена ​​в Windows XP, последняя строка никогда не достигается.

Этот код вызывается из MenuStrip, а затем передается последующему методу для выполнения действий, основанных на элементе, выбранном вменю.Однако это не единственное место, где происходит сбой SaveFileDialog, и всегда происходит сбой в методе ShowDialog ().

Код для MenuItem:

            private void saveOnlyPlaylistToolStripMenuItem_Click(object sender, EventArgs e)
            {
                try
                {
                    MainMenuClick(sender, e);
                }
                catch (Exception ex)
                {
                    StackTrace st = new StackTrace();
                    string methodName = st.GetFrame(1).GetMethod().Name;
                    Logger.LogToFile("Failure in " + methodName + ": " + ex.Message);
                }
            }

Код, который не выполняется:

            Logger.LogToFile("Entered Save Only Playlist.");
            SaveFileDialog sfd = new SaveFileDialog();
            string playlistSaveLocation = config["PlaylistLocation"];
            if (!Directory.Exists(playlistSaveLocation))
                Directory.CreateDirectory(playlistSaveLocation);
            sfd.InitialDirectory = playlistSaveLocation;
            sfd.Filter = "L Playlist (*.lpl)|*.lpl";

            DialogResult result = sfd.ShowDialog();
            Logger.LogToFile("Result of Dialog: " + result.ToString());

Я не могу понять, почему последняя строка не вызывается, похоже, что метод ShowDialog () в SaveFileDialog не завершается.После этого программа продолжает нормально работать, но больше не взаимодействует с каталогом файлов и не может создавать новые процессы.

В отладчике и в журнале событий не осталось ошибок.Я перестроил его на Windows XP, используя Visual Studio 2010, и он работал нормально, ошибка, кажется, появляется только тогда, когда программа создается в Windows 7, а затем устанавливается в Windows XP.Windows 7 является 64-битной.

Я должен отметить, что у меня есть все исключения из Debug -> Exceptions.

Я искал вокруг, и, кажется, не так много случаевсбой базового метода, такого как SaveFileDialog, есть идеи, что может вызвать эту проблему?


Дальнейший анализ, основанный на ответе ниже, привел меня к мысли, что, возможно, это как-то связано с тем, как SaveFileDialogназываетсяПоскольку это вызывается из MenuStrip, я считаю, что это выходит как отдельный поток.Это может быть причиной того, что метод ShowDialog () никогда не возвращается, но я не могу точно определить, почему это так.В попытке найти проблему, я создал отдельную форму окна, которая ничего не делала, но имела кнопку, чтобы открыть диалог сохранения файла.Эта кнопка работает и корректно возвращается, но при возврате управления обратно в исходный поток, похоже, снова выходит из строя.Все это основано на регистрации, которую я размещаю для целей отладки.

Код регистрации:

            public static void LogToFile(string message, FileInfo fInfo)
            {
                try
                {
                    if (!fInfo.Exists)
                        using (FileStream fs = fInfo.Create()) ;

                    message = DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + ": " + message;

                    File.AppendAllText(fInfo.FullName, message + "\n");
                }
                catch (Exception ex)
                {
                    StackTrace st = new StackTrace();
                    string methodName = st.GetFrame(1).GetMethod().Name;
                    MessageBox.Show("Failure in " + methodName + ": " + ex.Message);
                }
            }

Код для дополнительного окна:

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

                private void Buffer_Load(object sender, EventArgs e)
                {
                    Logger.LogToFile("Entered Save Only Playlist.");
                    SaveFileDialog sfd = new SaveFileDialog();
                    sfd.Filter = "Playlist (*.lpl)|*.lpl";
                    DialogResult result = System.Windows.Forms.DialogResult.Cancel;
                    try
                    {
                        result = sfd.ShowDialog();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Dialog problem: " + ex.Message);
                    }
                    Logger.LogToFile("Result of Dialog: " + result.ToString());
                    MessageBox.Show("Result of Dialog: " + result.ToString());
                    DialogResult = result;
                }
            }

Код выше работаети MessageBox.Show () фактически показывает результат диалога.

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Как правило, когда что-то подобное происходит со мной, я обнаружил, что получаю еще одно исключение из-за того, что отказался от моей catch функции моей try...catch функции.

Попробуйте и посмотрите, поможет ли это:

private void saveOnlyPlaylistToolStripMenuItem_Click(object sender, EventArgs e) {
  StackTrace st = null;
  string message = null;
  try {
    MainMenuClick(sender, e);
  } catch (Exception ex) {
    st = new StackTrace();
    message = ex.Message;
  }
  if (st != null) {
    try {
      string methodName = st.GetFrame(1).GetMethod().Name;
      Logger.LogToFile("Failure in " + methodName + ": " + ex.Message);
    } catch (Exception ex) {
      MessageBox.Show(ex.Message);
    }
  }
}

EDIT:

Что если вы переписаете свой Buffer_Load метод следующим образом:

private void Buffer_Load(object sender, EventArgs e)
{
  Logger.LogToFile("Entered Save Only Playlist.");
  DialogResult result = System.Windows.Forms.DialogResult.None;
  using (SaveFileDialog sfd = new SaveFileDialog())
  {
    sfd.Filter = "Playlist (*.lpl)|*.lpl";
    try
    {
      // Add `this`
      result = sfd.ShowDialog(this);
    }
    catch (Exception ex)
    {
      MessageBox.Show("Dialog problem: " + ex.Message);
    }
  }
  Logger.LogToFile("Result of Dialog: " + result.ToString());
  MessageBox.Show("Result of Dialog: " + result.ToString());
  // leave this line out - it would likely close your form:
  // DialogResult = result;
}

Ключевое слово this помогает, иногда.

0 голосов
/ 17 декабря 2011

Оказывается, эта проблема была проще, чем я предполагал. В Windows XP диалоговое окно «Сохранить файл» или «Открыть файл» изменит рабочий каталог и заставит программу искать его в этом месте. К сожалению, я не ожидал этого в своем Logger, и поэтому файл журнала перемещался в неожиданное место.

            Logger.WriteToFile("DEBUG TEXT", "Debug.log");

Понимая это, ошибка быстро ушла от SaveFileDialog и вместо этого была устранена путем обеспечения правильной ссылки на все мои файлы.

            string path = Path.Combine(Application.StartupPath, "Debug.log");
            Logger.WriteToFile("DEBUG TEXT", path);

Простая проблема, хотя в Windows 7 SaveFileDialog не меняет навсегда рабочий каталог, и это вызвало у меня замешательство. Надеюсь, что это поможет любому, кто столкнется с этой проблемой.

...