0

そのため、「test_09182009.xlsx」などのExcelファイルの名前を「test.xlsx」に変更しようとしています。ファイルが既に存在する場合は、ファイルを上書きしたいと思います。これは私のローカルマシンで私のために働いていたので、私は思ったが、ネットワークディレクトリではまったく働いていないようだ。誰かアイデアはありますか?

my $sourceDir = "\\networkPath\;

opendir ( DIR, $sourceDir );

foreach my $fileName (readdir(DIR)) 
{


    if (index($fileName, '_') != -1) 
    {
        rename($fileName, substr($fileName,0,index($fileName, '_')).".xlsx");
    } 
}
closedir(DIR);

そのため、名前を変更するファイルの作業ディレクトリにスクリプトがない場合に分離されていると思います。名前変更パラメータでそれを指定する方法はありますか?

4

2 に答える 2

2

人々が常に混乱していることの 1 つreaddir(および他の言語での同等のもの) は、ディレクトリ内のファイル名のみを返すことです。ファイルへのパスは返しません。したがって、あなたが入っていて、ファイルとを含む/home/exampleを呼び出すreaddirと、返されるのは だけで、 ではありません。/tmp/exampleabreaddira/tmp/example/a

一般に、 の結果を使用するときは常にreaddir、ファイルをディレクトリ名で修飾するか、ディレクトリを呼び出しているディレクトリに変更する必要がありますreaddir

この特定のケースでは、以下を追加します。

my $filePath = $sourceDir . $fileName;

あなたのループの先頭に($sourceDir実際のコードの末尾にバックスラッシュがあると思います;貼り付けたコードは実際には引用符を閉じません)そして、$filePathではなく、に作用し$fileNameます。(アンダースコアを含めることができる場合は、この回答を微調整する必要があり$sourceDirます。その場合、最初に変換されたファイル名を生成して$sourceDirから、名前を変更する前に両方を修飾することをお勧めします。)

于 2013-03-19T07:45:24.593 に答える
0

バックスラッシュの代わりにスラッシュを使用してみてください。そのような

my $sourceDir = "//networkPath/";

これは、Windows環境のActivePerlで機能しました。

于 2013-03-19T06:07:04.277 に答える