2

PHPは、fread、file_get_contents、file、readfileなど、さまざまな方法でファイルコンテンツを読み取ることができることを知っていました。

現在、特定のパーティションまたはフォルダー内のファイルとフォルダーの実際のインデックスを読み取ることができるAPIを探しています。たとえば、Windowsのドライブd:\には3つのフォルダー(folder1、folder2、folder3)が含まれ、各フォルダーにはいくつかのファイルが含まれています。 PHP(opendir、scandir、readdirなど)を使用してこれらのディレクトリ構造を取得し、必要に応じて一覧表示できますが、Windowsは、ファイルとフォルダの名前をハードディスク内に属性(サイズ、最終変更、作成日など)とともに保存します。 。

PHPを使用してハードディスクを読み取り、特定のパスのすべてのファイルとフォルダーの属性を取得するにはどうすればよいですか?たとえば、(filemtime())関数を使用できる最終変更時刻を考慮すると、この属性はファイル内に保存されず、ハードドライブ内の別の場所に保存され、他の属性もファイル内以外の場所に保存されます。

Windowsユーザーがフラッシュドライブからローカルハードにファイルをコピーすると、Windowsはすべてのファイルとフォルダーの属性をコピーし、ローカルハードドライブ内に保存します。PHPを使用してファイルをコピーする場合、このジョブを処理するのはOSに依存しますが、ファイルおよびフォルダー操作のネイティブサポートではありません(私が思うに)。

何か考えはありますか?ハードドライブのインデックスを読み取るためにこのテクノロジーを使用する多くの回復プログラムがありますが、PHPの場合:この問題の原因は見つかりません。

正解した場合のアプリケーション:そのようなファイルがハードドライブから安全に削除されたかどうかを確認できますか?PHPを使用して、または特定のファイルのハードドライブインデックスをクリアして、安全な削除アプリケーションを作成できます。

あなたの助けに感謝します。

4

3 に答える 3

2

提案の問題点

タイムスタンプ、許可フラグなどのファイルの属性は、ファイル システム (FAT、NTFS、Ext3 など) に保存されます。あなたが言うように、それらのいくつかはPHPのさまざまなファイルおよびディレクトリメソッドを使用して読み取ることができますが、それらはすべてOSファイルシステムの抽象化を通じて機能し、ディスク上の正確なバイトがアーカイブフラグを格納するなど、ディスク上のブロックレベル情報にアクセスできませんファイルXの場合。OSとFSの要点は、この情報をユーザー/クライアントプログラムから抽象化することです。

示唆されているように、c などで記述された外部ツールがあり、このアクセス権があり、PHP 内から呼び出すことができます。これを行うための「ネイティブな」PHP の方法が必要な場合は、これらの低レベル関数を公開する PHP 用の ac 拡張機能をコンパイルする必要があります。

PHPに固執したい場合は外部ツールが適していると思いますが、当面のタスクについては、あなたの説明からわかる限り、より低レベルのアクセスを持つ別の言語を使用します. C や C++ のように。PHP は HTML 前処理用の高水準言語であるため、低水準のシステム プログラミングには適していません。

実践的なアドバイス

PHP のドキュメントとさまざまなサードパーティのライブラリを調べた後:

ファイル アロケーション テーブル レベルでファイル システム情報を読み取る既製のソリューションは、PHP には存在しません。得られる最低レベルはfstat()関数であり、それはあなたが望むものとはほど遠いものではありません。

外部ツール

正確に何をしたいのかは関係ありませんが、おそらくそれを行う小さなバイナリがあります。PHP は、他の場所で提案されているように、exec() 関数を介してこれらのプログラムと統合できます。この問題に専念するための時間や開発リソースが十分にない限り、これはおそらく最も簡単な方法です。

ライブラリのラッピング

低水準言語で書かれた、この問題を解決するライブラリがあります。オープン ソース ライブラリを SWIG でラップして、PHP に公開することができます。これにより、必要な低レベルのメソッドにアクセスできるようになりますが、これは簡単な作業ではありません。これらの種類のライブラリは、多くの場合、作業中にデバイスへの唯一のアクセスを必要としますが、これはほとんどの通常の動作環境では実現が困難です。

また、おそらくファイル システムごとにライブラリが必要になることにも注意してください。Microsoft の FAT12/16/32 への VFAT 拡張には、使用するライセンスが必要です。そのため、FAT を使用して長い名前のファイル (8.3 形式ではない) を使用する場合は、合法であるためにいくつかの生地をフォークする必要があります。

低レベルの実装

最後の妥協点は、外部ライブラリを使用して低レベルの FS 関数にアクセスする独自の CLI ツールを作成することです。その後、PHP 内から exec() を使用して、独自の実装と対話できます。

これは、問題を解決する既存のツールが見つからず、ライブラリのラップに時間を費やしたくない場合に適した方法です。

最後に

アプリケーションが何であるかについてはほとんど説明せずに、非常に狭い問題の説明を提供します。問題は完全に別の方法で解決される可能性があるため、(別のフォーラムで) より広範な議論を行うと、より良い結果が得られる可能性があります。

于 2013-01-29T12:25:02.343 に答える
0

私が正しく理解していれば、ファイルを安全に削除したいだけです。[シュレッド][1]に電話するだけです

[1]:Linuxを使用していて、問題がない場合は、systemまたはexecを介してhttp://linux.die.net/man/1/shred

于 2013-01-30T21:29:03.713 に答える
0

私はあなたが望むことをするように見えるPHP.netで何かを見つけました:

http://php.net/manual/en/function.readdir.php#103418

編集:質問を誤解しました。最終変更時刻、最終アクセス日などの属性は、ファイル システム マスター ファイル テーブルに格納されます。私が知る限り、これは PHP ではアクセスできません。これを行う独自のメソッドを作成する場合は、さまざまなファイル システムを考慮する必要があります。独自の方法。

探しているすべての情報を取得するには、PHP 自体になんらかの形式の拡張機能を作成しない限り、PHP では不可能である可能性があります。

編集2:もう少し調査すると...

http://php.net/manual/en/function.fileinode.php

この関数は興味深いものになる可能性があります。

于 2013-01-29T12:04:21.310 に答える