1

相対パスを使用して日次ログファイルを書き込むログオブジェクトがあります。かなり簡単です(.NET 4.0、VS 2010)。

public void LogLine(string txt)
{
    DateTime dt = DateTime.Now;
    if (CurrentDay != dt.Day)
    {
        string newFileName = "..\\Log\\" + programName + dt.Day + ".log";
        fs = new FileStream(newFileName, FileMode.Create, FileAccess.Write);
        sw = new StreamWriter(fs);
        CurrentDay = dt.Day;
    }
    sw.WriteLine(txt);
}

これはほとんど常にうまく機能します。ただし、パスがまったく異なるランダムなDirectoryNotFoundExceptionのように見えることがあります。たとえば、プログラムを最初に実行すると、次のファイルが作成されます。

C:\ MyFiles \ Log \ MyApp19.log

プログラムをいくつか使用し、それを一晩実行して新しいファイルとストリームが作成された後(深夜以降の最初のログで)、次のようなことを示すDirectoryNotFoundExceptionに戻ります。

C:\ MyFiles \ MyOtherFiles \ Resources \ Log \ MyApp20.log

私が考えることができる唯一のことは、ソフトウェアの存続期間中にOpenFileDialogとSaveFileDialogを数回使用し、それらの開く/保存ダイアログの1つが内のファイルにアクセスすることです。

C:\ MyFiles \ MyOtherFiles \ Resources \ SavedFiles \

したがって、ダイアログを使用すると、何かを開いてSavedFilesディレクトリに保存し、新しいログを作成すると、相対ファイルパス.. \が(SavedFilesから) Resourcesに移動し、見つからないように見えます。ディレクトリはResources内にログを記録し、例外をスローします。ただし、ダイアログを使用して問題を再現することはできず、相対パスは実行可能ファイルに相対的であると思いましたか?[ファイルを開く/保存]ダイアログで、ソフトウェアが相対ファイルパスを計算する方法を変更できますか?誰か考えがありますか?御時間ありがとうございます!

4

3 に答える 3

3

Alng私は次のリンクがあなたを助けることができると思います:

http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.aspx

次の部分に注意してください。

重要:アプリケーションのユーザーがFileDialogのフォルダーを変更すると、アプリケーションの現在の作業ディレクトリがFileDialogで指定された場所に設定されます。これを防ぐには、RestoreDirectoryプロパティをtrueに設定します。

上記のリンクで説明されているように、パスにMicrosoftが提案した方法論を使用してみてください。

これは、 http://msdn.microsoft.com/en-us/library/system.windows.forms.application.executablepath.aspxにも役立ちます 。

よろしく

于 2013-02-20T15:36:52.733 に答える
2

相対パスは、常にアプリケーションの現在のディレクトリで機能します。これは、たとえば保存ダイアログを表示するときに簡単に変更できます。
実行可能ファイルを基準にしたパスを作成することをお勧めします。

var assembly = Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly();
var path = Path.GetDirectoryName(assembly.Location);
newFileName = Path.Combine(path,  "..\\Log\\" + programName + dt.Day + ".log");
于 2013-02-20T15:29:42.983 に答える
1

私は、アプリケーションがある時点で現在の作業ディレクトリを変更すると推測しています。その結果、それに基づいて、ログファイルには完全修飾パスを使用します。アセンブリの起動パス(Application.StartupPathなど)を使用できます。これは、アプリが何らかの理由でフォルダーを変更した場合でも変更されないはずです。

于 2013-02-20T15:32:58.120 に答える