2013-02-27 17 views
0

我有選擇的拷貝圖像從OpenFileDialog到一個所定義的位置的方法,以及我要檢查,如果具有相同名稱的圖像存在,並且如果是這樣改變對名稱飛。C# - 定製圖像名稱轉換成字符串

這裏是我的方法:

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+=一切都加入,甚至.jpeg後,這不是我想要的。我能想到的唯一解決方案是使用regex,但我真的很想找到另一種方法。

此外,增加i++並將其與+=相加會導致不需要的結果,即: imageName1.jpeg, imageName12.jpeg, imageName123.jpeg...imageName1234567.jpeg

所以,我怎樣才能得到我想要的結果,我看到這裏的妥協是ImageNameFilter之後添加下劃線_,然後在selectedFileName開頭添加i而到底,因爲它是在默認情況下。但是在字符串的開頭添加一些東西也是我不知道該怎麼做的。正如你可能看到我嘗試StringBuiledr + Insert,但我沒有得到預期的結果。

回答

3

基本上,在啓動循環之前,您需要將擴展​​名中的基本文件名(使用Path上的有用方法執行此操作)分開,然後繼續生成文件名。每名候選人將基於最後一個產生的(它只是基於固定信息和當前迭代次數),所以你並不需要在所有一StringBuilder涉及。

這裏有一個整潔的方式做到這一點的兩個步驟。首先,建立簿記:

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); 
+0

謝謝,超過我目前的水平,但會使用它。 – Leron 2013-02-27 14:41:26

+0

@Leron:這不涉及,儘管如果你對LINQ不熟悉,它確實看起來如此。它從一系列整數開始,將每個文件轉換爲一個文件名,並選擇第一個爲'!File.Exists()'條件爲真的文件(如所寫的,如果它嘗試所有20億個候選者並且所有這些都在使用中)。重要的是,所有這些都是懶洋洋地計算出來的,所以它只需要儘可能多的工作來找到一個未使用的文件名(相對於先製作一個20億個候選名單然後嘗試每個名單)。 – Jon 2013-02-27 14:44:19

1

使用Path.GetFileNameWithoutExtensionString.TrimEnd('.')獲得的文件名不帶擴展名。您也可以使用FileInfo獲取擴展名。