アプリと同じフォルダにあるファイルについて

解決


唯香  2009-07-30 00:15:07  No: 146177

いつもお世話になっております。

自社ソフトをWindows7RCにて現在テスト中です。
VB6で作られたアプリについては問題なく通ったのですが
VB.net(2008)で作ったアプリはエラーがでました。

問題の箇所はApplication.StartupPath上の
XMLファイル(アプリ設定)やTXTファイル(エラーログ)に
My.Computer.FileSystem.WriteAllTextなどの処理を実行させたときに起こります。
(パス'《フルパス》'へのアクセスが拒否されました)

そういえばVistaからはProgram FilesやC直下のファイルは
触っちゃいけないみたいなことを聞いた覚えがあって納得したのですが
VB6で作ったINIファイル(アプリ設定)やTXTファイル(エラーログ)は
なんでエラーにならないのかと調べたところ
アプリが置いてある場所にINIやTXTがないのに正常に動いていることに気づき
リダイレクション機能というものにたどり着きました。

なぜそういう機能ができたかは理解できたのですが
VB6アプリは何もしなくても勝手にやってくれてる(みたい)なのに
VB.NETではいちいちVistaまたはWindows7ならここ↓にと
C:\Users\(アカウント名)\AppData\Local\VirtualStore\Program Files\(フォルダ名)
指定してやらなくてはいけないのでしょうか?

みなさんはどのようにされているのでしょうか?

ちなみにスレ違いのようですいませんが
Windows7のC:ProgramDataフォルダは
アプリのデータの保存先として使ってよいものなのでしょうか?

XP Pro/VB2008


aetos  2009-07-30 01:17:28  No: 146178

アプリにマニフェストが付いていると、VirtualStore へのリダイレクトは働きません。
Environment.GetFolderPath( Environment,SpecialFolder.ApplicationData )
で取得できるフォルダに保存するのがよいでしょう。

> アプリのデータの保存先として使ってよいものなのでしょうか?

基本的にはだめです。


唯香  2009-07-30 20:18:23  No: 146179

aetos様お返事ありがとうございます。

> アプリにマニフェストが付いていると、VirtualStore へのリダイレクトは働きません。

「マニフェスト」というものを知らなかったので勉強になりました!
管理者権限で実行すると従来どおりの動きをするようですね。

ただ(アプリ名).exe.manifestを入れてもWindows7RCでは入れないときと同じ反応です。
昨日ずっとテストしていたんですが謎です。

> Environment.GetFolderPath( Environment,SpecialFolder.ApplicationData )
> で取得できるフォルダに保存するのがよいでしょう。

やはりユーザーごとに設定できるようにした方がいいんですね。
ProgramFilesではなくこちらに置くようにします。
こういう"普通はどうするのか"がわからないのでとても参考になりました。

> > アプリのデータの保存先として使ってよいものなのでしょうか?

> 基本的にはだめです。

わかりました。
いろんなプログラムを入れたらいつの間にかいろんなファイルが入っていたので
今回みたいにProgramFilesの制限によって
データはこっちに入れるようにということなのかと思っていました。

aetos様本当に助かりました。
ご教授いただきありがとうございました。


aetos  2009-07-31 21:07:16  No: 146180

> 管理者権限で実行すると従来どおりの動きをするようですね。

リダイレクトが働く条件は、
1.アプリにマニフェストが付いていない
2.対象フォルダに対するアクセス権がない
です。
管理者権限で実行するとアクセス権がありますので、リダイレクトされません。

> ただ(アプリ名).exe.manifestを入れてもWindows7RCでは入れないときと同じ反応です。

VS2005 だか 2008 だかからは、ビルドすると勝手にマニフェストが埋め込まれます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加