1

サイトのリストを保持する既製のテキスト ファイルを使用するプログラムを作成しました。現在、一部のコンピューターではプログラムが正常に動作しますが、私の友人のコンピューターでは動作しません。

2台のWindows 7コンピューターと1台のXPでプログラムをチェックしましたが、エラーはありません。このプログラムはXPでしばらく使用されていましたが、友人が自宅のWindows 7コンピューターにインストールしたいと考えていますが、プログラムをインストールした後、プログラムはファイルを見つけません。

これは彼が得るエラーです:

System.IO.FileNotFoundException: file not found 'C:\Users\eli\AppData\Roaming\fourmlinks.txt'.
file name: 'C:\Users\eli\AppData\Roaming\fourmlinks.txt'

問題は、このファイルをメイン プログラム フォルダー (アプリケーション ファイル) に入れても、まだ見つからないということです。

これは、プログラムの起動時にファイルを見つけるために使用するコードです。

sring path = "";
path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\fourmlinks.txt";
            System.OperatingSystem osInfo = System.Environment.OSVersion;
            if (osInfo.Platform == PlatformID.Win32NT)
            {
                if (osInfo.Version.Major == 5 && osInfo.Version.Minor != 0)
                {
                    //running XP
                    //path = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\fourmlinks.txt";
                    path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\fourmlinks.txt";
                }
            } 

ご覧のとおり、Windows 7 と Windows XP で動作することを確認しようとしました。

注:このファイルの操作方法を変更したり、この方法を失ったりして、OS(win 7およびXP)で機能するまったく別の方法を試してもかまいません。もしあなたが私に新しい方法を提案してくれたら、喜んで試してみます。

私の質問:

  1. プログラムが一部のコンピューターで機能し、一部のコンピューターで機能しない可能性はありますか?
  2. プログラムフォルダ以外の別の場所にファイルを置きますか?

(私の英語でごめんなさい)

4

1 に答える 1

5
プログラムが一部のコンピューターで機能し、一部のコンピューターで機能しない可能性はありますか?

プログラムはコンピューターに固有のものに依存しており、この何かが 2 つのコンピューター間で異なるためです。たとえば、エラー メッセージには次のように表示されます。

ファイルが見つかりません 'C:\Users\eli\AppData\Roaming\fourmlinks.txt'

プログラムはユーザー フォルダ内のファイルを探しています。これはすべてのマシンのすべてのユーザーに固有のものであり、異なるユーザーと異なるマシンには異なるファイルがあります。

プログラムフォルダー以外の別の場所にファイルを置きますか

私は?いいえ、できません。そのマシンのユーザーではないからです。「私のプログラムはファイルを別の場所に置くことができますか...」という意味であれば、はい、できます。

string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "fourmlinks.txt");

これにより、ログオンしているユーザーのプライベート アプリケーション データへのパスが取得されます。あなたのマシンのこのフォルダーに「fourmlinks.txt」ファイルがあり、他の誰かが自分のマシンにこのファイルを持っていない場合、あなたが尋ねたように、それはあなたのマシンでは機能しますが、他の誰かのマシンでは機能しません。

string path = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location),
    "fourmlinks.txt");

これにより、インストールされたファイルへのパスが取得されます。あなたと他の誰かの両方がプログラムをインストールした場合、あなたと他の誰かの両方がファイルを持っています。どちらかがファイルを変更すると、もう一方が変更を取得します。

常に使用する必要がありますGetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)か?まあ、それは依存します。GetExecutingAssembly().Location通常、標準ユーザーは書き込みができず、読み取り専用の場所です。ユーザーにデータの読み取りのみを許可し、書き込みを禁止する場合は、そこに配置するのが適切です。そうでない場合は、そうではありません。

ユーザーが読み書きできる新しいファイルを作成する場合は、Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData). アプリケーションにいくつかの開始データをインストールするが、ユーザーがそれを変更できるようにする場合は、開始データ ファイルをアプリケーションに含める必要があります。にインストールされSystem.Reflection.Assembly.GetExecutingAssembly().Locationます。次に、アプリケーションは次のようにする必要があります。

string fileName = "fourmlinks.txt";
string target = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), fileName);
if (!File.Exists(target))
{
    string source = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), fileName);
    File.Copy(source, target);
}

とのもう 1 つの重要な違いはGetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)前者がインストーラー パッケージの一部であることです。ユーザーがアプリケーションをアンインストールまたは更新すると、ランタイムのすべての変更が削除されます。

アプリケーションが変更されても削除されない独自のプライベート データを各ユーザーに持たせたい場合は、Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).

于 2012-11-08T20:01:39.867 に答える