1

我有一个程序处理我的一些图像,并将它们返回到我的目录。有趣的是,它们现在都是 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);
  }
}
4

6 回答 6

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,抱歉我误读了该部分。

在命令行上(更简单!):

仁 *.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());
                }
            }
        }
    }
}
于 2009-03-24T22:31:14.423 回答
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

于 2009-03-24T22:28:10.187 回答
1

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

编辑:出于某种原因,stackoverflow 不喜欢在链接 3 中使用括号,因此您必须手动复制和粘贴它。我可能会选择批处理方法,因为 Java 并不是您执行管理任务的首选 :)

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

于 2009-03-24T22:29:11.840 回答
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)));
于 2009-03-24T22:35:24.897 回答
0

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

于 2009-03-25T01:58:55.437 回答
-1

对于 C#,以下将执行您想要的操作 - 1. 打开文件所在目录
的 DirectoryInfo 实例 2. 获取所有具有您要更改的扩展名的文件。3. 通过重命名来 更改每个文件的扩展名。


于 2009-03-24T22:26:46.947 回答