9

重複の可能性:
現在の作業ディレクトリからの相対パスを取得していますか?

絶対パスから相対パスへのいくつかの画像を含むC#のコードがあるため、アプリケーションの折り畳みがどこにあるかに関係なく画像を見つけることができます。

たとえば、私のコード (およびイメージのラップトップ) のパスは次のとおりです。

C:/something/res/images/image1.jpeg

コード内のパスを

..../images/image1.jpeg 

C:したがって、パーティションの名前が何であれ、フォルダーが配置されている場所ならどこでも実行できます。

ソリューションの残りの部分と同じフォルダーにある限り、アプリケーションフォルダーの場所に依存しない、または別のパーティションにある場合は、コードにパスを設定したいと考えています。

私はこのコードを持っています:

 try 
 { 
     File.Delete("C:/JPD/SCRAT/Desktop/Project/Resources/images/image1.jpeg");
 } 
 catch (Exception) 
 { 
      MessageBox.Show("File not found:C:/Users/JPD/Desktop/Project/images/image1.jpeg");
  } 

このコードは、ファイルとフォルダーがその特定のパス (コードの場所でもある) にある場合にのみ実行されます。そのパスを相対パスにしたいので、フォルダー全体 (コード、ファイルなど) をどこに置いても、プログラムは引き続き実行されます。コード (プロジェクト フォルダーの下にあります) がフォルダー イメージと同じ場所にある限り機能します...どうすればよいですか?

4

3 に答える 3

12

相対パスは、アプリケーションの実行元のバイナリファイルに基づいています。デフォルトでは、バイナリファイルは[directory of your .csproj]/ bin/debugに出力されます。したがって、.csprojと同じレベルで画像フォルダを作成したいとします。次に、相対パス「../../images/someImage.jpg」を使用して画像にアクセスできます。

これをよりよく感じるために、テストとして以下を試してください。

1)新しいビジュアルスタジオサンプルプロジェクトを作成し、

2).csprojと同じレベルに画像フォルダを作成します

3)画像フォルダにいくつかのファイルを置きます

4)このサンプルコードをメインメソッドに配置します-

    static void Main(string[] args)
    {
        Console.WriteLine(Directory.GetCurrentDirectory());
        foreach (string s in Directory.EnumerateFiles("../../images/"))
        {
            Console.WriteLine(s); 
        }
        Console.ReadLine(); // Just to keep the console from disappearing.
    }

手順(3)で配置したすべてのファイルの相対パスが表示されます。

于 2012-10-22T21:26:54.087 に答える
8

参照:現在の作業ディレクトリからの相対パスを取得していますか?

Uri uri1 = new Uri(@"c:\foo\bar\blop\blap");
Uri uri2 = new Uri(@"c:\foo\bar\");
string relativePath = uri2.MakeRelativeUri(uri1).ToString();
于 2012-10-22T20:38:44.833 に答える
0

プログラムの設定によっては、フル パス文字列の一部をスキップして、単純に相対パスを使用できる場合があります。それは自慢できるものではないので、J. Skit は私の光沢があるかもしれませんが、単にそれを機能させたいという印象を受けています。美しさは後回し。

String absolutePath = @"c:\beep\boop\HereWeStart\hopp.gif";
String relativePath = absolutePath.Substring(13);

次に、必要に応じて、数値 13 (これは醜くて望ましくないアプローチですが、まだ機能しています) を動的に計算されたものに交換できます。たとえば (相対パスが開始するディレクトリ "HereWeStart" が でその文字列の最初の出現であると仮定するとabsolutePath)、次のように移動できます。

String absolutePath = @"c:\beep\boop\HereWeStart\hopp.gif";
int relativePathStartIndex = absolutePath.IndexOf("HereWeStart");
String relativePath = absolutePath.Substring(relativePathStartIndex);

また、あなたの質問は別の質問をします。絶対パスを取得する方法を知りたいです。おそらく、ハッスルをすべて一緒に回避するためのさらに賢い方法があるでしょうか?

編集

次のアプローチを試すこともできます。Directory絶対パスを与えるクラスを忘れてください。直接相対パスに進みます。削除しようとしているすべてのファイルが同じディレクトリにあると想定しています。そうでない場合は、さらに線を追加する必要がありますが、そこに着いたらその橋を渡ります。

回答を緑色のチェック済みとしてマークすることを忘れないでください (または、何が不足しているか、まだ改善可能かを説明してください)。

String
  deletableTarget = @"\images\image1.jpeg", 
  hereWeAre = Environment.CurrentDirectory;
MessageBox.Show("The taget path is:\n" + hereWeAre + deletableTarget);

try
{ File.Delete(hereWeAre + deletableTarget); }
catch (Exception exception)
{ MessageBox.Show(exception.Message); }

また、例外処理を自由に変更できることに注意してください。あなたのシステムが機能している間、組み込みのメッセージング システムに依存する方が良い方法です。そうすれば、よりプロフェッショナルなエラー メッセージが表示されます。実行時にエラーが発生することはありませんよね? ;)

于 2012-10-22T21:11:12.473 に答える