1

私のいくつかの画像に対してプログラムを実行すると、それらが私のディレクトリに返されました。面白いことに、現在はすべて gif ではなく png 画像になっています。

最初は単純な名前の変更だと思っていましたが、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

for /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

あなたはおそらく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 に答える
1

フォルダー内のすべての .png ファイルの名前を Java で .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 に答える
0

Cを使用できる場合は、boost ::algorithimstringalgoライブラリまたはboost::regexを使用できます(これを行うための強力な方法が本当に必要な場合)。可能であれば、データをコピーするのではなく、ディスク上に新しいハードリンクを作成するだけなので、ファイルの移動などにWindows API EDIT(または同等のLinux)を使用するとはるかに高速になることに注意してください。

于 2009-03-25T01:58:55.437 に答える
-1

C# の場合、次のように実行します
。1.ファイルが存在するディレクトリ
の DirectoryInfo インスタンスを開きます 。2. 変更する拡張子を持つすべてのファイルを取得します。
3. 名前を変更して、各ファイルの拡張子を変更します。

于 2009-03-24T22:26:46.947 に答える