0

PHPでfwriteを使用してファイルを作成する必要があるプロジェクトがあります。私がやりたいのは、それを汎用にすることです。各ファイルを一意にして、他のファイルを上書きしないようにしたいのです。phpフォームからテキストを記録してhtmlとして保存するプロジェクトを作成しているので、generated-file1.htmlやgenerated-file2.htmlなどを出力したいのですが、よろしくお願いします。

4

5 に答える 5

1

ファイル名の最初の部分として時間を使用することをお勧めします(これにより、ファイルが時系列/アルファベット順にリストされ、@ TomcatExodusから借用して、ファイル名が一意になる可能性を高めます(2つの送信が同時に)。

<?php
$data = $_POST;
$md5  = md5( $data );
$time = time();
$filename_prefix = 'generated_file';
$filename_extn   = 'htm';

$filename = $filename_prefix.'-'.$time.'-'.$md5.'.'.$filename_extn;

if( file_exists( $filename ) ){
 # EXTREMELY UNLIKELY, unless two forms with the same content and at the same time are submitted
  $filename = $filename_prefix.'-'.$time.'-'.$md5.'-'.uniqid().'.'.$filename_extn;
 # IMPROBABLE that this will clash now...
}

if( file_exists( $filename ) ){
 # Handle the Error Condition
}else{
  file_put_contents( $filename , 'Whatever the File Content Should Be...' );
}

これにより、次のようなファイル名が生成されます。

  • 生成されたファイル-1300080525-46ea0d5b246d2841744c26f72a86fc29.htm
  • 生成されたファイル-1300092315-5d350416626ab6bd2868aa84fe10f70c.htm
  • 生成されたファイル-1300109456-77eae508ae79df1ba5e2b2ada645e2ee.htm
于 2011-03-14T05:27:46.333 に答える
1

これにより、特定のディレクトリ内のhtmlファイルの数がカウントされます

 $filecount = count(glob("/Path/to/your/files/*.html"));

新しいファイル名は次のようになります。

$generated_file_name = "generated-file".($filecount+1).".html";

そして、使用してfwrite$generated_file_name

私は最近同様のことをしなければならず、代わりに uniq を使用しましたが。このような:

$generated_file_name = md5(uniqid(mt_rand(), true)).".html";
于 2011-03-14T01:29:14.493 に答える
0

既存のファイルを上書きしないことを確実にしたい場合は、ファイル名にuniqid()を追加できます。シーケンシャルにしたい場合は、ファイルシステムから既存のファイルを読み取り、次の増分を計算する必要があります。これにより、IO オーバーヘッドが発生する可能性があります。

私は uniqid() メソッドを使います:)

于 2011-03-14T01:22:05.600 に答える
0

実装が毎回一意のフォーム結果 (したがって一意のファイル) になる必要がある場合は、フォーム データをファイル名にハッシュして、一意のパスと、重複をすばやく整理する機会を与えることができます。

// capture all posted form data into an array
// validate and sanitize as necessary
$data = $_POST;

// hash data for filename
$fname = md5(serialize($data));

$fpath = 'path/to/dir/' . $fname . '.html';

if(!file_exists($fpath)){

    //write data to $fpath

}
于 2011-03-14T01:36:58.493 に答える
-1

次のようにします。

$i = 0;  
while (file_exists("file-".$i.".html")) {  
 $i++;  
}
$file = fopen("file-".$i.".html");
于 2011-03-14T01:25:00.747 に答える