VisualStudioでファイルの相対パスを取得するにはどうすればよいですか?


82

Visual Studioのソリューションエクスプローラーで追加した画像ファイルのパスを取得しようとしていますが、その画像の相対パスを取得できませんでした。Hは私のプロジェクトのファイル構造です:

/ BulutDepoProject
    / FolderIcon
        Folder.ico
        Main.cs

私はこのような画像を得ることができます:

"C:\\Users\\Tolga\\Desktop\\BulutDepo\\BulutDepoProject\\FolderIcon\\Folder.ico" 

しかし、私は次のようなものでそれを得ることができるはずです:

"~\\FolderIcon\\Folder.ico"

正確な構文がわからないので、画像を取得できません。:(


あなたはこの=>確認する必要がありstackoverflow.com/questions/6895457/...
MarcD

回答:


54

あらゆる種類の外部ファイルを使用する場合は、プロジェクト内のフォルダーにそれらを配置する方法は確かにありますが、リソースから取得するほど有効ではありません。通常のVisualStudioプロジェクトResources.resxでは、Propertiesセクションの下にファイルが必要Resource.resxです。そうでない場合は、独自のファイルを簡単に追加できます。そして、そこにあらゆる種類のファイルを追加します。ここで、プロジェクトにリソースファイルを追加するためのウォークスルーに到達できます

プロジェクトにリソースファイルがあると、次のように簡単に呼び出すことができます。

var myIcon = Resources.MyIconFile;

もちろん、次のusing Propertiesようなステートメントを追加する必要があります。

using <namespace>.Properties;

4
@ christo8989 OPは画像ファイルに関するもので、readonlyとにかくそうなるので....
Jesse Chisholm

38

私は少し遅れており、これがあなたが探しているものであるかどうかはわかりませんが、誰かがそれを役立つと思った場合に備えて追加したいと思いました。

これがファイル構造であると仮定します。

/BulutDepoProject
    /bin
        Main.exe
    /FolderIcon
        Folder.ico
        Main.cs

Main.exeファイルを基準にしたパスを書き込む必要があります。だから、Folder.icoあなたはMain.csあなたが使用できるあなたの中で、にアクセスしたいです:

String path = "..\\FolderIcon\\Folder.ico"

それは私にとってはうまくいったようです!


1
参照されているファイルはソリューション内の別のプロジェクトによって管理されているため、これは私の場合はより良いソリューションです。構文は単一のドットもサポートしていませんか?string path = ".\\FileName.txt"
クリストファーJ.グレース

1
これはひどい解決策です。使用しないでください...これは、「デバッグ」シナリオでは、現在の作業ディレクトリが<Project>/Debug VSデバッグ環境で機能するためにのみ機能します。しかし、IDEから抜け出すか、別の作業ディレクトリからEXEを実行すると、確実に機能しなくなります。
TomerW19年

25

「〜」を省略します。

var path = @"FolderIcon\Folder.ico";

~\ファイルシステムに関しては何の意味もありません。正しく使用されていることを確認した唯一の場所は、ASP.NETがチルダをアプリケーションのルートへの絶対パスに置き換えるWebアプリです。

通常、パスはEXEが配置されているフォルダを基準にしていると想定できます。また、Visual Studioの[プロパティ]タブで、画像が「コンテンツ」および「新しい場合はコピー」/「常にコピー」として指定されていることを確認してください。


unix / linuxでは、「〜」は「ホームディレクトリ」の同義語です。
Nyerguds

1
@Nyergudsはい。ただし、スラッシュは間違った方法であり、この質問には「Visual Studio」というタグが付けられています。これは、特にこの質問が投稿された2012年には、Linuxと実際には互換性がありません。
3Dave

「通常、パスはEXEが配置されているフォルダからの相対パスであると想定できます」<<非常に正しくありません!WindowsでEXEをダブルクリックすると、作業ディレクトリはユーザーのプライベートな場所であり、実行可能な場所ではありません。
TomerW19年

@TomerW実行可能ファイルをダブルクリックする以外に、実行可能ファイルを実行する方法はたくさんあります。
3Dave

正解ですが...アプリケーションは、最も一般的なDblclickを含め、あらゆる方法で機能するはずです。
TomerW19年

17

私も同じ問題に遭遇し、それを乗り越えることができました。それでは、私が適用した手順について説明しましょう。あなたのシナリオに合わせて説明します。

私のメソッドによると、相対パスを取得するには、「Path」クラスと「Assembly」クラスを使用する必要があります。

したがって、ステートメントを使用する際には、最初にSystem.IOとSystem.Reflectionをインポートします。

次に、以下のコード行を入力します。

        var outPutDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly(). CodeBase);

実際には、上記の行には、プロジェクトの出力ディレクトリのパスが格納されています(ここで、「output」ディレクトリはプロジェクトのDebugフォルダを指します)。

次に、FolderIconディレクトリをDebugフォルダにコピーします。次に、以下の行を入力します。

var iconPath = Path.Combine(outPutDirectory, "FolderIcon\\Folder.ico");

これで、この 'iconPath'変数には、Folder.icoのパス全体が含まれます。あなたがしなければならないのはそれを文字列変数に格納することだけです。そのためには、以下のコード行を使用してください。

string icon_path = new Uri(iconPath ).LocalPath;

これで、このicon_path文字列変数をアイコンへの相対パスとして使用できます。

ありがとう。


1
なぜfile:道の前にあるのか
コロブキャニオン

2
@KolobCanyon .NETアセンブリは、ディスク(COMオブジェクト、RPCなど)だけでなく、さまざまなURIから実行できるためAssembly.GetExecutingAssembly().Locationです。ファイル(EXE / DLL)を確実に処理する場合に使用できます
TomerW19年

3

これを使うのが一番簡単だと思います

new Uri("pack://application:,,/FolderIcon/" + youImageICO);

または、このコードは、フォルダがルートプロジェクトにある場合、変更したい場合はどのマシンでも機能します...このセクションを変更するだけです@ ".. \"

public static string bingPathToAppDir(string localPath)
{
    string currentDir = Environment.CurrentDirectory;
    DirectoryInfo directory = new DirectoryInfo(
        Path.GetFullPath(Path.Combine(currentDir, @"..\..\" + localPath)));
    return directory.ToString();
}

2

Visual Studioで、ソリューションエクスプローラーペインの[Folder.ico]ファイルをクリックしてください。次に、[プロパティ]ペインが表示されます。「出力ディレクトリにコピー」の動作を「新しい場合はコピー」に変更します。これにより、VisualStudioはファイルを出力binディレクトリにコピーします。

相対パスを使用してファイルパスを取得するには、次のように入力します。

string pathToIcoFile = AppDomain.CurrentDomain.BaseDirectory + "//FolderIcon//Folder.ico";

それがお役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.