🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1734閲覧

C#でショートカットのリンク先を相対リンクとする方法

noita

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/01/01 23:03

編集2021/01/02 00:56

ショートカットを作成してリンク先をソフトの実行ファイルにするとき、普通にターゲット指定を

string targetPath = Directory.GetCurrentDirectory() + "\hoge.exe" ;

のようにしているのですが、これだと当該フォルダをコピーして、中にあるショートカットで起動させた場合、コピー元の実行ファイルがターゲットとなってしまいます。

フォルダをコピーしても、ショートカットのリンク先が相対リンクとなるようにすることはできないでしょうか。

追記
ショートカットを作るコードはごく一般的なもので次を参考にしています。

https://cammy.co.jp/technical/2017/05/30/c-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/01/01 23:07

コピーした後でショートカットを作ればいいのでは?
noita

2021/01/02 00:37

リンク先を既にあるショートカットで起動させたいという趣旨です。
Zuishin

2021/01/02 00:38

既にあるショートカットではなく、新しく作ればいいという主旨です。
y_waiwai

2021/01/02 00:40

そのショートカットを作るコードを提示しましょう
Zuishin

2021/01/02 00:42

または、コピーをファイルコピーの API で行うのではなく、ファイルを読み書きして自前でコピーすれば追随しません。
noita

2021/01/02 00:50

返信ありがとうございます。 ターゲットファイルは同一フォルダ内に依存する数多くのdllがあるため単独でコピーしても意味をなさないのです。 ショートカットのリンク先を絶対指定ではなく、実行ファイルから見ての相対位置にすることは、やはり難しいのかなという気がしてきております。
noita

2021/01/02 00:53

また、OSの設定を変更する方法は、ソフトの頒布を堰堤としているため難しい状況です。
Zuishin

2021/01/02 00:53

コピーした後でショートカットを作るという方法を取るのが普通です。
noita

2021/01/02 01:05

ということをしたくなかったため、お伺いしました。 やはり無理なのだということが分かりました。 それだけでも、情報として助かりました。 ありがとうございました。
YAmaGNZ

2021/01/02 01:20 編集

ソフトの頒布ならインストーラー作ってそこでショートカットを作成すればいいのでは? これがZuishinさんの言う「後から作る」に当てはまるかと
noita

2021/01/02 01:29

すいません、説明が不足していました。あるサイトのアカウントを分ける手段として一括してコピーするという操作をするものです。メインのソフトの部分はインストーラーでショートカットを作成しております。そのソフトをコピーする際に作ったショートカットが使えないため質問しました。 なお、頒布やアカウントの作成等については質問外となります。
Zuishin

2021/01/02 01:53 編集

説明が不足しているので対応も大雑把になりますが、そのままコピーするのではなく、一度アーカイブすればいいでしょう。 ある前提さえ解決すれば簡単に解決する問題は多いですが、その前提を絶対のものと固執して秘匿する人が多いので、解決法もいびつになりがちです。 今回もショートカットの作り方ではなく、コピーの仕方を変えるだけで簡単に解決しそうです。具体的なコピーの仕方についてはすでに二種類書きました。二番目の方法、つまりアーカイバを使う方法は、プログラミングしない人向けです。プログラミングする人、つまり関数やループを知っている人は、あなたの切って捨てた最初の方法でも簡単に解決できます。
noita

2021/01/02 02:11

あくまでもユーザーのアクセシビリティ向上のために、ユーザーが実行ファイルにアクセスせずにショートカットを作成できないかと思ったところです。前提としてユーザーにコピーをさせるということで考えていましたが、確かに、コピー操作も面倒でしょうから、プログラム的に行えばもしかすると簡単なのかも知れません。ソフトにコピーの機能を付けて、そのときにコピー先をターゲットとしたショートカットを作るだけで済みます。ただ、そうすると、もともとのソフトをマルチアカウント対応にした方が楽になってしまいます。そこまでのコンセプトはないもので、簡単に相対パスのショートカットを作成できないかと思ったところです。この主旨に沿うような方法がもしかするとあるのかと思って質問させていただきました。ありがとうございました。
Zuishin

2021/01/02 02:26 編集

インストーラーがなくて自分でコピーする時点でアクセシビリティ落ちていますので、本末転倒です。Chocolatey のスクリプトなどを作るのが良いのではないかと思います。 まず主旨が間違っているため、たとえ実現する方法があったとしても検討の余地があります。学習ならともかく、複数の処理を何度も繰り返すのがわかっていてスクリプトを作らず Explorer を使わせる理由がありません
noita

2021/01/02 02:37

なるほどChocolateyですか。その方法まで考え及びませんでした。確かにそうすると趣旨に合いそうです。ありがとうございました。
guest

回答2

0

コメントのある通り、相対パスをセットするのは無理でしょう。

解決方法としては、リンク先のプログラムは単純コピーされているとすると同一なので、別にどのプログラムが起動されても良いはずで、どのショートカットから起動されたのかが分かれば良いのでは?

ショートカットファイルのWorkingDirectoryを空にしておけば、ショートカットの存在するディレクトリがプログラム起動時のカレントディレクトリーになるので、プログラム中でカレントディレクトリーを取得すれば良いかと思います。

投稿2021/01/02 03:00

otn

総合スコア85886

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

Zuishinさんの言う通りChocolateyのスクリプトを作成しようと思います。

投稿2021/01/02 02:43

noita

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問