2

私はここで見つけたコードを使用していますが、これはうまく機能しますが、サブディレクトリ内のファイルにアクセスしようとすると、機能したくありません。

ファイルを取得し、書き込む一時ファイルを作成し、ファイル内のテキストを検索してそのテキストを新しいテキストに置き換え、更新されたファイルを保存してから、一時ファイルを削除します。

以下は正常に機能します。

        $reading = fopen('links.htm', 'r');
        $writing = fopen('links.tmp', 'w+');

        $replaced = false;

        while (!feof($reading)) {
          $line = fgets($reading);
          if (stristr($line,'::template::')) {
            $line = "replacement line!\n";
            $replaced = true;
          }
          fputs($writing, $line);
        }
        fclose($reading); fclose($writing);
        // might as well not overwrite the file if we didn't replace anything
        if ($replaced) 
        {
          rename('links.tmp', 'links.htm');
        } else {
          unlink('links.tmp');
        }

これは機能しません:

        $reading = fopen('path/to/links.htm', 'r');
        $writing = fopen('path/to/links.tmp', 'w+');

        $replaced = false;

        while (!feof($reading)) {
          $line = fgets($reading);
          if (stristr($line,'::template::')) {
            $line = "replacement line!\n";
            $replaced = true;
          }
          fputs($writing, $line);
        }
        fclose($reading); fclose($writing);
        // might as well not overwrite the file if we didn't replace anything
        if ($replaced) 
        {
          rename('path/to/links.tmp', 'path/to/links.htm');
        } else {
          unlink('path/to/links.tmp');
        }

助言がありますか?

これpathは絶対的なものです。以前にコードで定義し、ファイルの作成と書き込みに使用しましたが、上記のコードを同じように機能させたい場合は、必要ありません。

また、フォルダのアクセス許可は書き込みと読み取りに設定されており、これも正常に機能します。

サブフォルダ内のコードを実行し、正常に動作しますが、トップレベルディレクトリからは動作しません。

エラー報告がオフになっています。今すぐオンにします。

別のプロセスによって使用されているため、プロセスはファイルにアクセスできません。(コード:32)

4

2 に答える 2

2

1 週間かけていろいろと調べ、テストし、壊し、再コーディングした後、これを行う簡単な方法を見つけました。

ほとんどのコンテンツは links.htm ファイルと同様に動的に作成されるため、コードが約 300 のクライアント サイトにアクセスしてリンク ファイルを更新するため、いつどこでファイルにアクセスするかを見つけるのは非常に困難でした。

簡単な修正:

$path = "path/on/server/";

$conn_id = ftp_connect("ftp.testftp.com") or die("Could not connect");
ftp_login($conn_id,"admin","ert456");

$old_file = $path.'links.htm';
$new_file = $path.'_template.htm';
ftp_rename($conn_id, $old_file, $new_file);

$source = fopen($new_file, "w");
$localTarget = "path/to/links.htm";

ftp_fget($conn,$source,$localTarget,FTP_ASCII);

    $reading = fopen('path/to/links.htm', 'r');
    $writing = fopen('path/to/_template.htm', 'w+');

    $replaced = false;

    while (!feof($reading)) {
      $line = fgets($reading);
      if (stristr($line,'::template::')) {
        $line = "replacement line!\n";
        $replaced = true;
      }
      fputs($writing, $line);
    }
    fclose($reading); fclose($writing);
    // might as well not overwrite the file if we didn't replace anything
    if ($replaced) 
    {
      rename('path/to/_template.htm', 'path/to/links.htm');
    } else {
      unlink('path/to/_template.htm');
    }

 $local_file = "path/to/links.htm";

 ftp_put($conn_id, $path, $local_file, FTP_BINARY);

 ftp_close($conn_id);

これを行うにはおそらくもっと簡単な方法がありますが、これが私にとってはうまくいきました。

于 2012-04-30T14:59:33.497 に答える
1

PHP に書き込みを行うには、そのディレクトリへの書き込み権限が必要です。現在のディレクトリへの書き込み権限はある.が、サブディレクトリへの書き込み権限がない可能性があり./path/to/ます。

編集: PHP エラーが発生した場合は、質問に含める必要があります。

OP編集後に編集:

このエラーは、何かが現在links.htm開かれていることを意味します。ファイルの名前を変更する前にファイルを ing しているように見えるので、おそらく他のアプリケーション (ブラウザやテキスト エディタなど) で開いてfclose()いると思います。links.htm

編集#3:

links.htmまたはファイルのいずれかを別のアプリケーションで開いていない場合はlinks.tmp、Windows を使用している可能性があります。この場合、rename()呼び出しはfclose()、コード内では の後に来ますが、 の前に実行されます。sleep()これに対する解決策は、ハンドルを閉じた後に呼び出しを追加することです。

fclose($reading); fclose($writing);
sleep(1); // this should allow the handle to be properly closed before the rename() call
于 2012-04-20T13:00:48.160 に答える