一次又一次地以相同的方式重命名文件

时间:2009-03-24 22:19:24

标签: c# java batch-file file-rename

我有一个关于我的一些图像的程序工作,它将它们返回到我的目录。有趣的是,他们现在都是png图像而不是gif。

起初我认为这是简单的重命名,但我使用createimagefrompng()测试了php,如果图像不是有效的png文件,则会抛出错误。没有错误返回。

这是否给我100%准确的结果不是问题,问题是我想以类似的方式重命名所有这些文件。

现在虽然我可以写一个php文件来为我做这个,但我想知道如何在批处理或c#或java中执行以下操作。

所有这些文件仍然包含字符串“.gif”,我想删除它。 在php中,它就像使用foreach循环一样简单,使用str_replace读取文件,然后销毁旧文件并编写新文件。

我有点担心我会如何批量,c#或java,有人可以帮助我吗?

另外,我正在运行Windows Vista,我安装了Powershell 1.0。

解决方案1 ​​ - C#:

var files = Directory.GetFiles(@"C:\Downloads\Temp\test\");
foreach (var file in files)
{
  if(file.Contains(".gif"))
  {
    string testing = string.Format("{0}.png", Path.GetFileNameWithoutExtension(file.Replace(".gif", "")));
    File.Move(file, @"C:\Downloads\Temp\test\"+testing);
  }
}

6 个答案:

答案 0 :(得分:4)

在命令行上:

(假设没有.gif文件)

REM first rename all .gif.png to .gif
for %i in (*.gif.png) do ren %i %~ni

REN then rename all .gif to .png
for %i in (*.gif) do ren %~ni.gif %~ni.png

使用/ help查找您的Windows版本支持的%选项。

以下与.gif.png无法合作,抱歉我误读了那一部分。

命令行上的

(更简单!):

  

ren * .gif * .png

Java版本(针对.gif.png修复):

import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main
{
    public static void main(final String[] argv)
    {
        final File   dir;
        final File[] entries;

        dir     = new File(argv[0]);
        entries = dir.listFiles(new FilePatternFilter(".*\\.gif\\.png"));

        for(final File entry : entries)
        {
            if(entry.isFile())
            {
                final String path;
                final String newPath;
                final File   newEntry;

                path     = entry.getPath();
                newPath  = path.substring(0, path.length() - "gif.png".length()) + "png";
                newEntry = new File(newPath);

                if(!(entry.renameTo(newEntry)))
                {
                    System.err.println("could not rename " + entry.getPath() + 
                                       " to " + newEntry.getPath());
                }
            }
        }
    }
}

答案 1 :(得分:3)

在批处理中,您可以执行以下操作:

@echo off
setlocal enabledelayedexpansion enableextensions
for %%f in (*.gif.png) do (
    set fn=%%f
    set fn=!fn:.gif=!
    ren "%%f" "!fn!"
)
endlocal

这应该可行,至少如果文件名为.gif.png ...如果没有,则更改for语句中的过滤器。 set可以找到有关help set语句中替换内容的更多帮助。

答案 2 :(得分:1)

如果要将文件夹中的所有.png文件重命名为.gif,我建议您查看Apache Commons IOFileUtils类提供了一种迭代所有具有给定扩展名的文件的方法([iterateFiles] [3]),而File本身提供了renameTo方法。

编辑:由于某种原因,stackoverflow不喜欢链接3中的paranthesis,所以你必须手动复制和粘贴它。我可能会选择批处理方法,因为Java并不是管理任务的首选:)

[3]:http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#iterateFiles(java.io.File,java.lang.String [],boolean)

答案 3 :(得分:1)

您可以在c#

中执行以下操作
var files = new DirectoryInfo(@"c:\files").GetFiles(@"*.gif");
foreach (var file in files)
    File.Move(file.FullName, string.Format("{0}.gif", Path.GetFileNameWithoutExtension(file.FullName)));

或更简单..

var files = Directory.GetFiles(@"c:\files", @"*.gif");
foreach (var file in files)
    File.Move(file, string.Format("{0}.gif", Path.GetFileNameWithoutExtension(file)));

答案 4 :(得分:0)

如果你可以使用C,你可以使用boost :: algorithim stringalgo库和/或boost :: regex,如果你真的想要一个强大的方法来做到这一点。请注意,使用Windows API EDIT(或Linux等效物)进行移动文件等会更快,因为它们只会在磁盘上创建新的硬链接,而不是复制数据,如果可能的话。

答案 5 :(得分:-1)

对于C#,以下内容可以满足您的需求 -
1.打开文件存在的directory的DirectoryInfo实例 2.获取包含您要更改的扩展名的所有文件 3.按renaming更改每个文件的扩展名。