ファイルパスの移植性
-
07-07-2019 - |
質問
*nix と Windows で実行する必要があるプログラムがあります。プログラムはファイルからファイルパスを取得するため、問題は、 \
対 /
問題。
私の現在の考えは、使用しているシステムに応じて、間違ったものを正しいものに変換する正規表現を入れることです。これにより、どちらのタイプもどちらのシステムでも動作できるようになります。という事実とは別に、 今、私には2つの問題があります, 、他に問題がある人はいますか?
(他のより良いソリューションは大歓迎です)
編集:主な問題は、その逆ではなく、Windows パスを UNIX 上で動作させることです。
解決
/はwin32でも完全にサポートされています。
もご覧ください。他のヒント
Windowsは通常\または/のいずれかを受け入れるため、/を標準化すると、ファイル名を完全に制御できる限り、問題がより簡単になります。
「ファイルマネージャ」の作成を検討しましたか?すべてのファイルパスの問題を処理するクラスですか?メールアプリケーションでは、データファイルを読み込むときにこのように呼び出すことができます。
LoadApplicationData(FileManager.GetDataFilePath)
その後、ファイルマネージャは、それが存在する環境を検出し、適切なファイルパスオプションを返します。そうすることで、Win32とUnixの位置標準(Program Filesと/ usrなど)にも対応できます。
ドライブ文字(Unixではアナログなし)と特別な「フォーク」(MacOS X以前の用語-同様にUnixでもアナログではありませんが、MacOS Xにはありますが-驚き、驚き) )提供することができます。注意してください。
入力用のパーサーを作成して、ディレクトリを表すノードのツリー構造を作成します。次に、ツリーをたどって必要な区切り文字を書き込むか、オプションでディレクトリが存在するかどうかを確認したり、メタファイルを書き込んだりすることで、「保存」できます。これは実際、私自身のアプリケーションに役立つだろうと今ちょうど考えているものです:-)
使用している言語を言わなかったので、勝手にc / c ++と仮定します。 boost を使用する場合は、ファイルシステムライブラリ。もちろん、動的言語を使用している場合、FS抽象化ライブラリもおそらくそこに既に存在します(たとえば、perlでは、File :: Specは非常に標準的です)。
どのような種類のファイルからパスを読み取っているかを教えていません。これらは設定ファイルであると仮定します。その場合、方法はたくさんありますが、私の考えでは、正しい答えは、可能であればパスの操作を避けるようにプログラムを設計することです。ここに回答を投稿しました: https://stackoverflow.com/a/40980510/2345997 それは関連しています。
方法:
- コマンド ライン オプションを追加すると、ユーザーは構成ファイルからパスを読み取るのではなく、問題のパスを指定できるようになります。
- ユーザーがベース パスを指定できるように、コマンド ライン オプションを追加します。構成ファイル内のパスは、このベース パスの下にあるものとして解釈されます。
- 設定ファイルを 3 つに分割します。1 つのファイルはクロスプラットフォーム構成を持ち、別のファイルは Windows のみの構成を持ち、最後のファイルは Linux のみの構成を持ちます。これにより、ユーザーは Windows と Linux の両方に正しいパスを指定できるようになります。Windows では、プログラムはクロスプラットフォーム構成ファイルと Windows のみの構成ファイルを読み取ります。Linux では、クロスプラットフォーム ファイルと Linux 専用の構成ファイルが読み取られます。
- 構成ファイルの解析に前処理を追加します。これにより、プログラムが実行されている OS に応じて、ユーザーがファイル内の一部の行をプログラムに無視させることができる 1 つの構成ファイルを作成できるようになります。したがって、ユーザーはファイルへのパスを 2 回指定できます。Linux 用に 1 回、Windows 用に 1 回。
- ファイルが常に実行可能ファイルと同じディレクトリに配置されるように設計を変更します。その場合、ユーザーはファイルへのパスではなく、構成ファイル内でファイル名のみを指定します。
- 「/」を「\」に切り替える簡単な関数を使用します。次に、パスを Linux パスとして指定する必要があり、この変換が Windows に適用されることをユーザーに文書化します。
- このための独自のパス ミニ言語を作成し、ユーザーに文書化します。例えば:「/」 - ディレクトリ区切り文字を指定します。 {root} - ファイルシステムのルートに展開します。 {cwd} - 現在のディレクトリに展開します。 {app} - アプリケーションへのパスに展開します。その後、ユーザーは次のようにファイル パスを指定できます。両方のプラットフォームの {root}/myfiles/bob.txt。
- 一部のパスは両方のプラットフォームで動作します。例えば:../my files/bill.txt のような相対パス。アプリケーションがこれらのパスでのみ動作するように制限します。この制限と、アプリケーションがユーザーへのパスを処理する方法を文書化します。