运行exec()命令的次数与txt文件的行数一样多


run exec() command as many times as the lines of txt file

我正在使用Sox(Sound eXchange)库将.wav文件转换为.flac。如果我使用终端,它运行良好:

$Brus:~ pum$ sox outputFolder/file/file.000.wav flac/file.000.flac

文件file.000.flac被正确地转换到flac文件夹中。

同样在我的脚本中,如果我运行:

         exec('sox/sox outputFolder/file/file.000.wav flac/file.000.flac');

转换效果良好。

我现在的问题是,我需要转换一批文件。我用要转换的文件列表.wav(listWav.txt)创建了一个txt文件,我想在"listWav.txt"文件中有多少行文件名的时候运行"exec()"命令。

这是listWav.txt文件:

outputFiles/file/file.000.wav
outputFiles/file/file.001.wav

这是listFlac.txt文件:

file.000.flac
file.001.flac

这是我在尝试运行"exec()"命令时写的代码,如下所述:

//read all txt files content
$file2 = fopen("listFlac.txt","r");
$file3 = fopen("listWav.txt", "r");
//loop the file and read it line by line
while(! feof($file2) && ! feof($file3)){
  $tt = fgets($file2);
  $tt2 = fgets($file3);
  //run sox conversion
  exec('sox/sox' . ' ' . $tt2 . ' ' . 'flac/' . $tt);
}
fclose($file2);
fclose($file3);

如果我打印_r('sox/sox'.''.$tt2.''.'flac/'.$tt);结果是:

sox/sox outputFiles/file/file.000.wav flac/file.000.flac sox/sox outputFiles/file/file.001.wav flac/file.001.flac

因此,"exec()"命令的循环执行的次数与文件"listWav.txt"的行数一样多,但它不能正常工作,因为只生成了"file.001.flac",所以我理解while循环允许"exec

有人知道我必须在脚本中编辑什么才能为列表中的所有文件运行"exec()"的次数吗?

EDIT:我用这种方式解决了问题,我在嵌套时将while一分为二,并调用了两个等效的"exec()"命令。代码可能不太优雅,但它符合我的目的。

while(! feof($file2)){
  $tt = fgets($file2);
    while (!feof($file3)) {
      $tt2 = fgets($file3);
      exec('sox/sox' . ' ' . $tt2 . ' ' . 'flac/' . $tt);  
    }
      exec('sox/sox' . ' ' . $tt2 . ' ' . 'flac/' . $tt); 
}

使用file函数,并在循环中添加一个计数器。

$flacArray = file("listFlac.txt");
$wawArray = file("listWav.txt");
$i=0;
foreach ($flacArray as $flac) {
    $wavInfo = pathinfo($wawArray[$i]);
    exec('sox/sox' . ' ' . $flac . ' ' . 'flac/' .  $wavInfo["basename"] . str_pad($i, 3, "0", STR_PAD_LEFT) .".wav");
    $i++;
}

注意:这只适用于999文件。