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

人们总是感到困惑的一件事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 环境中使用 Active Perl 工作的。

于 2013-03-19T06:07:04.277 回答