2013-11-14 2 views
5

私は.Net WinFormsを書いていて、DEBUGとRELEASEの設定を絶えず切り替えています。いくつかのファイルがありますが、いずれかの設定が必要です。私は何を考えていたが、それは次のようになりますので、BINフォルダに共通のディレクトリにファイルを置くことだったEnvironment.CurrentDirectoryとSystem.IO.Directory.GetCurrentDirectory

MyProject/Bin/CommonFiles 
MyProject/Bin/Debug 
MyProject/Bin/Release 

そして、私は線に沿って何かを使用してファイルへのアクセスを考えていましたの:

System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory).FullName 

私の質問は、私が読んだから、System.IO.Directory.GetCurrentDirectoryがオープンファイルダイアログボックス、たとえば、新しいカレントディレクトリを選択するユーザーが原因で変更される可能性があります、ので、これは危険である場合です。私はそこから移動したり、一般的に受け入れられている方法/場所にすることができます/Binフォルダを取得する

System.IO.Directory.GetParent(Environment.CurrentDirectory).FullName 

ORがあっても良い方法を:

は、私はむしろの線に沿って何かを使用すべきプログラムが通常到達する必要のあるファイルを格納し、それをより簡単に参照する方法(WinFormsだけでなく、あらゆる種類のアプリケーションで動作するように作られたもの)

+0

binディレクトリがシステムを構築VSの実装の詳細です。プロジェクトにソースコードをつけて顧客に出荷することは考えにくいので、ファイルをc:¥program files¥binに保存することはできませんが、これは良い方法ではありません。書き込み可能なファイルには%appdata%、読み取り専用ファイルにはEXEディレクトリ、%programdata%を使用します。 –

+0

ありがとう@HansPassant ...私は以下のクリスチャンに語ったので、多くのユーザーがこのプログラムを一度使用するだけで、それは自分の組織内の共有ドライブ上にあるので、各ユーザーのコンピュータのappdataフォルダにそれらを常にコピーするのは少し躊躇しますこの時点で...それについてのどんな考え? –

答えて

3

the solution offered by Joe aboveを、微調整のかなり後に、私の状況に最適なソリューションであることが判明しました。


まず

、私が一緒に行った最終的な解決策:私のBinディレクトリと同じレベルで、私の場合は(Common Filesディレクトリを作成し

  • が、それは必要はありません、それだけで説明します私は後で我慢するよコードは
  • は私のプロジェクト
  • メイドのための余分なリソースファイルとして()サブディレクトリを含め、そのディレクトリ内のすべてのファイルを設定するには、私の.vbproj(または `、csproj ')ファイルを編集)どのように動作しますかセcondを編集して.vbprojファイルをビルド時にすべてのリソースファイルをbin \ Debugまたはbin \ Releaseディレクトリにコピーします。

第二に、私はこれを行うことを学んだ方法:

  • Joes solution above
  • This linkを追加することができますので、の.vbproj/.csprojファイルにワイルドカードを追加することができるようにする方法を示して一度に完全なディレクトリに置いてください。

    • 私は上記の私のproject.vbprojファイル
    • を開く:最後に、私の解決策は

  • 私の\ビンディレクトリにファイルをコピーする方法を示して
  • This answerライン<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />、私は1つの新しいItemGroupを次のように追加しました:

<ItemGroup> <CommonFiles Include="Common Files\**" /> </ItemGroup>

(すべてのサブフォルダを含む)すべてのファイルで、この負荷とIにビルドアクション<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />が、私は次の行に追加した行の下にCommonFiles

  • を与えます:

<Target Name="CopyCommonFiles"> <Copy SourceFiles="@(CommonFiles)" DestinationFolder="$(OutDir)\%(RecursiveDir)" SkipUnchangedFiles="true"/> </Target>

これは、ビルド時にあなたのbin \デバッグ/ビン\リリースディレクトリにCommonFilesビルドアクションからファイルをコピーします。

これが私のやり方です。コメント/思考は本当に大歓迎されている

)あなたは、私は別の方法か何かを使用しているべきだと思う場合)....

この

6

System.Reflection.Assembly.GetExecutingAssembly().Locationでアプリの.exeの場所を取得できます。

string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; 
string exeDir = System.IO.Path.GetDirectoryName(exePath); 
DirectoryInfo binDir = System.IO.Directory.GetParent(exeDir); 
+2

アセンブリがシャドウコピーされている場合、Assembly.Locationにはシャドウコピー後の場所が含まれます。より良い解決策は、AppDomain.BaseDirectoryを使用することです:http://stackoverflow.com/a/6041505/13087 – Joe

1

設定データなどがある場合は、%Appdata%ディレクトリに保存します。インストールディレクトリに変更される可能性のあるファイルを置くことは良い考えではなく、Windows Vista以降では禁止されています。構成データは特別なフォルダである%Appdata%フォルダに格納する必要があります。あなたのプログラムにそのパスをハードコードしないでください - 外国人または32/64bit Windowsのユーザーには深刻な問題があります。

どのようにあなたがここに見ることができるのAppDataフォルダにアクセスすることをお勧め: How to create appdata folder with C#

+1

これは実際に構成データではありません - これは実行時にプログラムが必要とするより多くのファイルです...私は少し躊躇しています多くのユーザーがこのプログラムを一度だけ使用する必要があるため、各組織のコンピュータ上のappdataフォルダにコピーしてください。この時点で私の組織の共有ドライブに置かれています。 –

+1

@JohnBus​​tosそれは間違いなく有効な点です。私は職場で非常に似通った勤務をしており、プログラムの史跡に単にパスを保存しています。これは設定として保存されるため、ユーザーが新しいファイルの場所を選択できる小さな画面を簡単に作成できます。私はパスをハードコードすることを躊躇しています - それは将来変化するかもしれません。 –

0

次のコードは、次のように私はそれを行うだろうhttp://msdn.microsoft.com/en-us/library/ms229654(v=vs.90).aspx

String strAppDir = Path.GetDirectoryName(
     Assembly.GetExecutingAssembly().GetName().CodeBase); 
    String strFullPathToMyFile = Path.Combine(strAppDir, "fileName.txt"); 

    MessageBox.Show(String.Format("Path to the application is: '{0}'." + 
     "Full path to the file in the application folder is: '{1}'", 
     strAppDir, strFullPathToMyFile)); 
4

からです:

  • プロジェクト内のファイルのサブフォルダを作成します。 "一般的なファイル"。

  • このフォルダに設定ファイルを置きます。そのプロパティを設定します。

    • ビルドアクション=コンテンツ

    • 出力ディレクトリにコピー=コピーは常に:ファイルは、その後、コピーされます

  • (または多分より新しい場合はコピー)アプリケーションがビルドされるたびにbin \ Debug \ CommonFilesまたはbin \ Release \ CommonFilesにコピーします。あなたは、それらを参照することができます回答のほとんどは、実際に動作するようには思えなかったが、

    Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CommonFiles\MyFile.Dat"); 
    
+0

これは最もスマートなアイデアのようです...これらのファイルは両方とも必要ですが、.dllsも必要です...今、私はこれが奇妙に思えるかもしれませんが、おそらく約50程度のファイルが10程度あります私はこれを行う必要がある別のディレクトリ(ユーザー入力に基づいて、特定のファイルを開きます)...そのディレクトリ全体のこれらのプロパティを一度に変更する方法はありますか、このファイルごとに行う必要がありますか?ファイル...または、この新しいビットのデータがあれば、あなたがお勧めする別の方法がありますか?感謝!!! –

+0

このテクニックは比較的少数の読取り専用の構成ファイルに適しており、ビルド時にはすべてのファイルが存在すると考えています。それらが読み取り/書き込みファイルであり、ユーザーが追加ファイルを追加できる場合、私はこれをしません。代わりに、binフォルダーの外の適切な場所(ユーザーが読み取り/書き込みファイルの場合にユーザーが書き込むことができるファイル)にファイルを置き、app.configにファイルを含むディレクトリを使用して構成設定を追加します。 – Joe

+0

ありがとう、ジョー - 彼らは書き込み可能ではなく、単にユーザーのマシンに保存されるテンプレート...ちょうど多くの異なるテンプレートと異なる目的のため、サブフォルダ....あなたはまだそれを言うと言いますapp.configでどのようにして最善を尽くすことをお勧めしますか(多分@Timのソリューションをあなたの追加提案/編集でどうやって? - あなたの継続的な助けをもう一度おねがいします!) –

関連する問題