2017-07-30 13 views
0

我有一個fileupload控件,我想要實現的是將一個紐結連接到它,以便它是唯一的。FileUpload如果存在concat(計數器)到名稱

所有這一切,我發現在談論添加職位GUIDDateTime

如果文件在文件夾中,然後將文件名是文件名+(計數器)

實例我想要實現的是:

  • 的文件夾中包含文件名 - file.png

1)當我再次上傳相同的文件名時,現有的文件名不會被刪除,新的名稱將被稱爲file(1).png

2)當我再次上傳相同的文件名,(file.png) 現在新的文件將被稱爲file(2)

我有這樣的代碼,處理第1'的情況下,但不是第二:

public static string GetUniqueName(string fileName) 
{ 
     string dir = Globals.Directories.GetCustomCategoryThumbnailDir(); 
     string fileExtension = Path.GetExtension(fileName); 
     string fileNameWE = Path.GetFileNameWithoutExtension(fileName); 
     string[] files = Directory.GetFiles(dir, "*" + fileExtension) 
           .Select(Path.GetFileName) 
           .ToArray(); 
     string uniqueName = fileNameWE; 
     int nextNum = 0; 
     bool fileExist = false; 
     string pattern = @"(.*)\(([\d]+)\)"; 

     foreach (var file in files) 
     { 
      var tempFileName = Path.GetFileNameWithoutExtension(file); 
      var match = Regex.Match(tempFileName, pattern); 

      if (tempFileName.Equals(fileNameWE)) 
      { 
       // file exist in folder 
       fileExist = true; 
      } 
      if (tempFileName.StartsWith(fileNameWE) && match.Success) 
      { 
       // there is a file name that start with "fileToUpload" name, we want to to take the number 
       nextNum = Convert.ToInt32(match.Groups[2].Value); 
       nextNum++; 
      } 
     } 

     if (nextNum == 0 && !fileExist) 
     { 
      // filename dont exist     
      return fileNameWE + fileExtension; 
     } 
     if (nextNum == 0 && fileExist) 
     { 
      // the file name exist without (1) 
      fileNameWE = $"{fileNameWE}(1)"; 
      return fileNameWE + fileExtension; 
     } 
     else 
     { 
      var haveParentessis = Regex.Match(fileNameWE, pattern); 

      if (haveParentessis.Success) 
      { 
       // we need to reset the nextNum 
       nextNum = 1; 
      } 

      // return the new unique name with suffix 
      fileNameWE = string.Format("{0}({1})", fileNameWE, nextNum); 
      return fileNameWE + fileExtension; 
     } 
    } 

我該如何做到這一點?

回答

0

是的,這是因爲您的while循環如下所示是本地函數,因此counter變量也是本地變量將不會保持它的當前值。因此,在本質每一次請求都得到一個新的頁面實例,因此您的counter將得到重新初始化爲0

while (File.Exists(Path.Combine(dir, fileNameWE + fileExtension))) 
{ 
     fileNameWE = fileNameWE + "(" + counter.ToString() + ")"; 
     counter++; 
} 

爲了得到這個工作,你應該在counter變量存儲在Session和檢索回來。不要忘了這是一個Web應用程序,因此國家將無法維持,除非你做它明確

if (File.Exists(Path.Combine(dir, fileNameWE + fileExtension))) 
{ 
     counter = (Session["counter"] != null) ? ((int)Session["counter"])++ : default(int); 
     fileNameWE = fileNameWE + "(" + counter.ToString() + ")"; 
     Session["counter"] = counter; 
} 
+0

謝謝,但該文件的名稱將始終與(計數器)串聯,因此新的文件夾中,如果文件'文件名(1)'存在名稱將是'文件名(1)(1)' ,這不是我想要的.. –

+0

@ E.Meir,不,它不會...嘗試一次,看看 – Rahul

+0

我沒有問題的數字。 。我有連接總是發生問題.. –

0

我得到這個使用正則表達式的工作,在下面。不需要持久計數器。我認爲concat問題是因爲沒有辦法處理現有的(1)後綴。我編寫了這個潛在的解決方案,希望它有幫助注意:只有在調試器輕輕測試,我是新手

{ 
    string fileName = @"C:\Uploads\Testfile.bin"; 
    string fileExtension = Path.GetExtension(fileName); 
    string fileNameWE = Path.GetFileNameWithoutExtension(fileName); 
    string pattern = @"(.*)\(([\d]+)\)$"; 

    var match = Regex.Match(fileNameWE, pattern); 
    if (match.Success) 
    { 
     int nextNum = Convert.ToInt32(match.Groups[2].Value); 
     nextNum++; 
     fileNameWE = $"{match.Groups[1].Value}({nextNum})"; 
    } 
    else 
    { 
     fileNameWE = $"{fileNameWE}(1)"; 
    } 
} 
+0

謝謝。你可以看一看嗎?我更新了代碼,我想在一次訪問文件系統時瀏覽目錄中的所有文件,而不是使用FileExist來進行每次調用的文件系統。 所以,我試圖使用你的代碼,但它不工作在新的情況下獲取目錄中的所有文件,你可以看看並幫助我解決? –

+0

我已經更新了它,現在它幾乎可以工作,但是例如如果該文件夾包含'army(2)(1).png'並且我想上傳'army(2).png',它將導致名稱爲'army (2)(1).png'但它需要是'army(2)(1)(1).png' –

+0

你能否澄清 - 在你的問題中你說過當「file.png」被上傳並且它存在,將名稱更改爲文件(1).png和文件(2).png。你在這個關於文件名文件(2)(1).png的評論似乎與此相沖突。此外,我的正則表達式需要進行調整,我將(使其與字符串的末尾匹配,希望減少不良匹配) – gnivler

相關問題