クリエイターの教科書

Excel, ChatGPT, Stable Diffusion, Visual Studioなどの教科書

【Visual Studioの教科書】C#でパスの書き方、インストール後のファイルエラーへの対処

Visual Studioでファイルの読み書きを行う場合などにはパスの管理が必要となってきます。ここではVisual Studioでのパスの操作についてまとめていきます。

パスの書き方

thinking...

パスはファイルのある位置を記述します。

 

パスの書き方

書き方は絶対パスなら以下のようにドライブ(Cなど)から書きます。

区切りマーク「¥」を2つ書くのは、この記号がエスケープ文字でも利用されるためです。

string sTemp = "C:\\Windows";

 

ただし最初に@マークを付けると「¥」マークは1つで書いても大丈夫です。

string sTemp = @"C:\Windows";

 

特定のパスを取得

以下の命令で特定のパスが取得できます。

 

・マイドキュメント
System.Environment.GetFolderPath(Environment.SpecialFolder.Personal)

・マイピクチャ
System.Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)

・マイビデオ
System.Environment.GetFolderPath(Environment.SpecialFolder.MyVideos)

・マイミュージック
System.Environment.GetFolderPath(Environment.SpecialFolder.MyMusic)

 

・デスクトップ

System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
・お気に入り
System.Environment.GetFolderPath(Environment.SpecialFolder.Favorites)

 ・スタートメニュー

System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)

 ・ウィンドウズシステムフォルダ
System.Environment.GetFolderPath(Environment.SpecialFolder.System)

 

・ユーザ共通の設定情報

Application.CommonAppDataPath

・ユーザ別の設定情報

Application.UserAppDataPath(ローミングあり)

Application.LocalUserAppDataPath(ローミングなし)

 

 

実行しているアプリのパス

現在起動しているアプリのパスを取得するには、

using System.Reflection;

を宣言の上、以下のようにして取得します。

Assembly myAssembly = Assembly.GetEntryAssembly();
string sTemp = myAssembly.Location;

 

 

 

インストール後のファイルエラーへの対処

インストール後、ファイルやディレクトリへアクセスできない?

フルパスでなく相対パスでファイルを指定していたら、Visual Studioで実行するときは問題ないものの、インストールさせたファイルではエラーになる場合がありました。

 

対処法の1つとしては、アプリの起動パスを取得してフルパスとして指定するようにプログラムを変更するやり方があります。

 

String fTemp = "temp.txt";

string s = System.Environment.CommandLine;
System.IO.FileInfo fi = new System.IO.FileInfo(s.Replace("\"", ""));
string startup_path = fi.Directory.FullName;

fTemp = System.IO.Path.Combine(startup_path, fTemp);

 

インストーラで空のディレクトリができない?

インストーラで空のディレクトリを追加した場合、インストールした後にエクスプローラでみてみるとディレクトリができてないことがありました。

 

便宜的な対処としては、1つでダミーのファイルをディレクトリに入れておけば作成されていました。

 

インストール後、ファイルを読み書きできない?

Visual Studioではちゃんと動くのに、インストーラを使ってインストールさせた後に起動するとファイルアクセスでエラーになりました。

 

いろいろ調べてみると、どうやら「管理者として実行」をしないと、アプリケーションフォルダ内へのアクセスに影響が出ているようです。

 

対策としては最初から管理者権限として実行させる設定をプロジェクトへ追加すればいいようです。

 

Visual Studioでアプリのプロジェクトを選択し、「追加>新しい項目」から「アプリケーションマニフェストファイル」を選びます。

f:id:apicode:20210226100955p:plain

 

追加した「アプリケーションマニフェストファイル」を開くと、コメント欄で

<!-- UAC マニフェスト オプション
Windows のユーザー アカウント制御のレベルを変更するには、
requestedExecutionLevel ノードを以下のいずれかで置換します。

<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

requestedExecutionLevel 要素を指定すると、ファイルおよびレジストリの仮想化が無効にされます。
アプリケーションが下位互換性を保つためにこの仮想化を要求する場合、この要素を
削除します。
-->

 と書かれています。

 

「<requestedExecutionLevel level="asInvoker" uiAccess="false" />」とあるところ「
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />」へと変更します。

 

なお、この後Visual Studioでアプリを実行しようとすると「権限変更の再起動」が求められたりします。Visual Studioを最初から管理者として実行しておけばこれは出ないようです。

 

いずれにせよ、アプリケーションのインストールフォルダ以外の場所に作業用ファイルをつくったりしたほうがいいのかもしれません。

このブログは、ネットや書籍上の情報、個人の体験や感想を中心にまとめたものです。 正確性を期していはいますが、間違い・誤訳等あるかもしれません。 当サイトの情報によって生じたいかなる損失について一切の責任を負わないものとします. あらかじめご了承ください。

プライバシーポリシー |〇利用規約 |〇問い合わせ