2

次のコードを含む C# アプリケーションがあります。

string file = "relativePath.txt";

//Time elapses...

string contents = File.ReadAllText(file);

ほとんどの場合、これで問題なく動作します。ファイルは、アプリが開始されたディレクトリに対して相対的に読み取られます。ただし、テストでは、約 5 時間放置すると、アプリがFileNotFoundException「C:\Documents and Settings\Adminstrator\relativePath.txt」が見つからないというメッセージをスローすることがわかっています。ただし、ファイルを読み取るアクションがすぐに実行される場合、ファイルは適切な場所から読み取られます。これを「C:\foo\relativePath.txt」と呼びます。

何を与える?そして、最良の修正は何ですか?に対してファイルを解決していますAssembly.GetEntryAssembly().Locationか?

4

6 に答える 6

7

パスを変更できる不気味な場所の 1 つは、OpenFileDialog です。ユーザーがフォルダー間を移動すると、アプリケーション ディレクトリが現在表示されているディレクトリに変更されます。ユーザーが別のディレクトリでダイアログを閉じると、そのディレクトリにとどまります。

ダイアログにパスをリセットさせるRestoreDirectoryというプロパティがあります。しかし、デフォルトは「false」だと思います。

于 2008-10-01T15:35:28.397 に答える
5

ファイルが常に実行可能アセンブリに対する相対パスにある場合は、Assembly.Location を使用します。Assembly.GetEntryAssembly の代わりに、必要に応じて Assembly.GetExecutingAssembly を主に使用します。これは、DLL からファイルにアクセスしている場合、パスは DLL パスに対する相対パスになることを意味します。

于 2008-10-01T15:32:44.750 に答える
2

レッスンは相対パスに依存するべきではないと思います。相対パスはエラーが発生しやすいです。現在のディレクトリは、ファイルダイアログのような実行中のプロセスのさまざまなものによって変更される可能性があります(ただし、変更を防止するプロパティがあります)。 Application.StartupPath (ただし、Visual Studio から起動する場合は注意してください) などの既知のパスまたはその他の既知のパスから固定パスを生成するための相対パス。

相対パスを使用すると、プロジェクトのまったく無関係な部分の変更が別の部分で失敗する可能性があるため、コードの保守が難しくなります。

于 2008-10-01T15:33:03.610 に答える
1

あなたが何かをするなら

> cd c:\フォルダ 1

c:\フォルダ 1 > ../フォルダ 2/theApplication.exe

アプリケーションの現在の作業ディレクトリは c:\folder 1 になります。

これがプログラムの例です

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CWD {
    class Program {
        static void Main (string[] args) {
            Console.WriteLine(Application.StartupPath);
        }
    }
}

これを VisualStudio でビルドし、debug/bin ディレクトリでコマンド プロンプトを開いて実行します。

ビン/デバッグ > CWD.exe

それからする

ビン/デバッグ > cd ../../ > ビン/デバッグ/CWD.exe

起動パスの違いがわかります。

元の質問に関連して...「約5時間放置すると、アプリはFileNotFoundExceptionをスローします」

アプリケーションが実行されると、予期された場所からそのファイルを移動または削除した場合にのみ、このエラーが発生します。

グレッグ

于 2008-10-01T15:44:49.417 に答える
1

System.Environment には、標準の相対パスを取得するのに役立つSpecialFolder列挙型があります。

このようにして、少なくともパスが内部的に取得されて返されるため、システムが何らかの形でパスを変更している場合、コードはそれを処理するだけです.

于 2008-10-01T15:36:46.770 に答える
0

openfiledialog を使用し、記憶パス プロパティ (正確な名前がわからない) が true の場合、現在のディレクトリが変更されると思います。

于 2008-10-01T15:36:45.537 に答える