0

OpenFileDialog選択した画像をから定義された場所にコピーする方法があり、同じ名前の画像が存在するかどうかを確認し、存在する場合はその場で名前を変更したいと思います。

これが私の方法です:

 public void SaveImage(IList<AppConfig> AppConfigs, string ImageNameFilter)
        {
            string imgPath = AppConfigs[0].ConfigValue.ToString();
            Int32 i = 0;
            StringBuilder sb = new StringBuilder(selectedFileName);

            while (File.Exists(imgPath + "\\" + ImageNameFilter + selectedFileName))
            {
                sb.Insert(i, 0);
                i++;
                //ImageNameFilter += (i++).ToString();
            }
            File.Copy(selectedFile, imgPath + "\\" + ImageNameFilter + selectedFileName);
        }

ImageNameFilterは各画像の先頭に追加されるカスタムフィルターであり、ユーザーはプレフィックスを確認するだけで、画像が何に使用されているかを認識できるようにするためにこのプレフィックスが必要です。selectedFileNameで撮影した画像の名前です。SafeFileNameつまり、次のようになります- imageName.jpeg

このコードにはいくつかの問題があります。まず、このように名前を変えたかったのですが、一緒にimageName1.jpeg, imageName2.jpeg, imageName3.jpeg...imageName14.jpeg..使っていると、後も全部追加してしまいます。私が考えることができる唯一の解決策は使用することですが、私は本当に別の方法を見つけたいと思っています。selectedFileName+=.jpegregex

また、インクリメントi++して追加すると、次の+=ような望ましくない結果が発生します imageName1.jpeg, imageName12.jpeg, imageName123.jpeg...imageName1234567.jpeg

したがって、どのようにして希望の結果を得ることができますか。ここで見られる妥協点は、デフォルトのように_、直後にアンダースコアを追加し、最後ImageNameFilterに追加することです。しかし、文字列の先頭に何かを追加することも、私には方法がわかりません。ご覧のとおり、 +を試しましたが、期待どおりの結果が得られません。iselectedFileNameStringBuiledrInsert

4

2 に答える 2

3

Path基本的に、ループを開始する前に、ベースファイル名を拡張子から分離する必要があり(これを行うには、便利な方法を使用してください)、ファイル名を生成し続ける必要があります。各候補は最後の候補に基づいて作成されることはありません(固定情報と現在の反復回数に基づいているだけです)。したがって、を含める必要はまったくありませんStringBuilder

これは、2つのステップでそれを行うための1つのきちんとした方法です。まず、簿記を設定します。

var canonicalFileName = ImageNameFilter + selectedFileName;
var baseFileName = Path.GetFileNameWithoutExtension(canonicalFileName);
var extension = Path.GetExtension(canonicalFileName);

次に、ループを実行します。ここでは、ループステートメントの代わりにLINQを使用していますが、ストックwhileループと本質的な違いはありません。

var targetFileName = Enumerable.Range(1, int.MaxValue - 1)
    .Select(i => Path.Combine(imgPath, baseFileName + i + extension))
    .First(file => !File.Exists(file));

File.Copy(selectedFile, targetFileName);
于 2013-02-27T14:35:07.780 に答える
1

Path.GetFileNameWithoutExtensionまたはを使用String.TrimEnd('.')して、拡張子なしでFileNameを取得します。を使用FileInfoして拡張機能を取得することもできます。

于 2013-02-27T14:34:30.657 に答える