我有一个关于我的一些图像的程序工作,它将它们返回到我的目录。有趣的是,他们现在都是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);
}
}
答案 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 IO。 FileUtils类提供了一种迭代所有具有给定扩展名的文件的方法([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)