5

ログ ファイルを解析し、特定のデータをサーバーに送信するアプリケーションを開発する必要があります。Linux と Windows の両方で実行する必要があります。

ログローリングシステムをテストしたいときに問題が発生します(.1を名前に追加して、同じ名前の新しいものを作成します)。Windows (Linux ではまだテストしていません) では、「入力モード」(ios::in) で開いても、std::ifstream() (排他アクセス?) で開いたファイルの名前を変更できません。 .

非排他的な方法でファイルを開くクロスプラットフォームの方法はありますか?

4

5 に答える 5

3

非排他的な方法でファイルを開く方法はありますか?

はい、Win32 を使用して、さまざまな FILE_SHARE_Xxxx フラグを CreateFile に渡します。

クロスプラットフォームですか?

いいえ、プラットフォーム固有のコードが必要です。

厄介な下位互換性の問題 (DOS アプリケーションはシングルタスクであるため、その下からファイルを削除することはできないと想定しています。 Win32 は Win16 アプリケーションの移植を容易にするためにこの仮定を維持しましたが、これはひどいことです)、Windows はデフォルトでファイルを排他的に開きます。

基盤となる OS インフラストラクチャは、開いているファイルの削除/名前変更をサポートしています (ただし、メモリ マップされたファイルを削除できないという制限があると思いますが、これは *nix に見られる制限ではないと思います) が、デフォルトのオープニング セマンティクスはサポートしていません。

C++ には、このような概念はありません。C++ オペレーティング環境は、DOS オペレーティング環境とほとんど同じです。他のアプリケーションが同時に実行されないため、ファイル共有を制御する必要はありません。

于 2008-08-26T11:02:41.227 に答える
1

Win32 ファイルシステムのセマンティクスでは、名前を変更するときに、名前を変更するファイルが (どのモードでも) 開かれていないことが必要です。ファイルを閉じて名前を変更し、新しいログ ファイルを作成する必要があります。

Unix ファイルシステムのセマンティクスでは、開いているファイルの名前を変更できます。これは、ファイル名が inode への単なるポインターであるためです。

于 2008-08-26T10:32:45.947 に答える
1

ファイルから読み取るだけの場合は、Windows api CreateFile で実行できることがわかっています。FILE_SHARE_DELETE | を指定するだけです。FILE_SHARE_READ | dwShareMode への入力としての FILE_SHARE_WRITE。

残念ながら、これはクロスプラットフォームではありません。しかし、Linux にも似たようなものがあるかもしれません。

CreateFile の詳細については、msdn を参照してください

編集: Greg Hewgill のコメントについて簡単に説明します。私は FILE_SHARE* のものでテストしました(100%確実です)。また、読み取り専用で開き、FILE_SHARE* パラメータを指定すると、ウィンドウでファイルの削除と名前変更の両方を行うことができます。

于 2008-08-26T10:35:41.120 に答える
1

排他モードを必要とするのは読み取り操作ではなく、名前の変更です。これは、ファイルを新しい場所に移動することと本質的に同じであるためです。

よくわかりませんが、これができるとは思いません。代わりにファイルをコピーしてみてください。その後、古いファイルが読み取られなくなったら、古いファイルを削除/置換してください。

于 2008-08-26T10:28:34.663 に答える
0

ファイルを開いたままにしないでください。たとえば、アプリがクラッシュした場合、これは奇妙なことにつながります。私がすること:

  1. (読み取り/書き込み/新しいファイルへのロールオーバー) を 1 つのクラスに抽象化し、そのクラスで新しいファイルにロールオーバーしたい場合にファイルを閉じるようにします。(これが最も適切な方法です。既にロールオーバー コードを持っているので、既に途中まで来ています。)
  2. 複数の読み取り/書き込みアクセス ポイントが必要で、fstreams のすべての機能が必要で、完全なラッパーを書きたくない場合、私が考えることができる唯一のクロス プラットフォーム ソリューションは、必要のないときに常にファイルを閉じることです。 、ロールオーバー コードがファイルへの排他的アクセスの取得を数回試行するようにします。
于 2008-09-16T11:47:16.700 に答える