2016-09-19 77 views
2

我有一堆圖像文件(.jpg)在一個文件夾中,然後我想列出它們到單個文件文本,我使用php(在Windows中的xampp)。從php創建txt文件列表

這在我的瀏覽器清單圖片名稱(它的工作):

<?php 
ob_start(); 
$file='F:\images\upload\google\ready_45'; 
    foreach (glob($file."\*.jpg") as $filenames) { 
      echo $filenames."<br />"; 
    } 
?> 

這對於創建一個名爲 'images_list.txt' 文本文件(不工作):

<?php 
ob_start(); 
$file='F:\images\upload\google\ready_45'; 
    foreach (glob($file."\*.jpg") as $filenames) { 
     $my_file = 'image_list.txt'; 
     $handle = fopen($my_file, 'w') or die('Cannot open file: '.$my_file); 
     $data = echo $filenames."<br />"; 
     fwrite($handle, $data); 
    } 
?> 

當我執行該腳本出現警告消息

「 解析錯誤:語法錯誤,在第7行D:\ xampp \ htdocs \ rename_file_php \ try_list_img.php中出現意外'echo'(T_ECHO)」

如果第7行,我改變

 $data = $filenames; 

文件「images_list.txt」將創建,但只填寫一個圖像文件名的文件清單。誰能幫我?

對不起,我的英語不好。

回答

1

打開文件一次,並嘗試一次寫入數據: -

<?php 
ob_start(); 
$file='F:\images\upload\google\ready_45'; 
$data = ''; 
foreach (glob($file."\*.jpg") as $filenames) { 
    $data .= $filenames."\n"; 
} 
$my_file = 'image_list.txt'; 
$handle = fopen($my_file, 'w') or die('Cannot open file: '.$my_file); 
fwrite($handle, $data); 
fclose($handle); 
?> 
+0

謝謝,最後它的工作 –

+0

@Ben ......很高興幫助你:) –

1

您只想將文件打開()一次,因此在循環之外。否則,您會一遍又一遍覆蓋內容。看看這個修改後的版本:

<?php 
$folder = 'F://images/upload/google/ready_45'; 
$my_file = 'image_list.txt'; 
$handle = fopen($my_file, 'w') or die("Cannot open file: ". $my_file); 
foreach (glob($folder . "/*.jpg") as $filename) { 
    $data = $filename . PHP_EOL; 
    fwrite($handle, $data); 
} 
fclose($handle); 

當然可以簡化這一點。例如,通過簡單地爆匹配文件名列表中有斷行,然後將結果寫到一氣呵成:

<?php 
$folder = 'F://images/upload/google/ready_45'; 
$data = implode(PHP_EOL, glob($folder . "/*.jpg")); 

$my_file = 'image_list.txt'; 
$handle = fopen($my_file, 'w') or die("Cannot open file: ". $my_file); 
fwrite($handle, $data); 
fclose($handle); 

但是第一(環型)方法允許更大的靈活性,例如過濾或逃逸。


旁註:

  • 使用正常斜線作爲分隔符的文件夾(/),而不是微軟Windows本地使用的瘋狂反斜槓(\\)會爲你節省很多的麻煩。 PHP可以在MS-Windows平臺上同時使用。

  • 使用換行符而不是html linewrap在大多數情況下寫入文件時更有意義。使用PHP_EOL而不是硬編碼換行符(\r\n)將使您的代碼便於使用不同類型換行符的系統(只有MS-Windows使用\r\n)。

  • 我冒昧地解決了一些縮進和代碼樣式問題。如果程序員寬鬆地達成一些標準以增強代碼的可讀性,那麼這肯定是有道理的。

+0

謝謝,我使用'\ n'創建了一個新行 –

+0

當然,如果您要創建的文件專門用於unixoid環境(如Linux),那很好。你可能想爲此定義一個常量。 – arkascha

-1

下面的代碼工作正常,我有是有一些圖像文件的圖像文件夾,請更改文件夾路徑,並嘗試下面的代碼

<?php 
    ob_start(); 
    $file='images'; 
    foreach (glob($file."\*.jpg") as $filenames) { 
    $my_file = 'image_list.txt'; 
    $handle = fopen($my_file, 'a') or die('Cannot open file: '.$my_file); 
    $data = $filenames."\r\n"; 
    fwrite($handle, $data); 
    } 
    ?> 
+0

這可能工作,但效率極低......你仍然在每次循環迭代中一次又一次地打開文件。此外,終止的php標籤('?>')通常被認爲是不好的樣式,因爲它可能會導致巨大的問題,並且根本不需要。 – arkascha

0

這就是你需要:

// Creates a newline separated list from the array returned by glob() 
$files = glob ($folder.'/*.jpg'); 
$files = implode (PHP_EOL, $files); 

∕∕ This is all that is needed to write something to a file. 
file_put_contents ($my_file, $files); 

fopen()以及所有舊的,舊的代碼,只要有可能就應該避免。這種方法不僅更簡單,更容易閱讀,而且速度也更快。 請注意,您可能想要在最後一行中包裝IF語句,以便處理可能出現的寫入錯誤。

+0

只適用於新的PHP版本或可以在所有版本中使用?我的xampp版本是1.7.3 –

+0

如果您檢查'file_put_contents()'的PHP手冊,您會發現它需要PHP 5及更高版本。我不確切知道哪個版本是在xampp版本中,但除非它大約有十年之久,否則它應該有PHP的5.x版本。 http://php.net/file_put_contents – ChristianF