我已經創建了一個截圖程序,所有工作都很好。唯一的問題是,我不知道如何使它成爲截圖保存附加數字。C# - 添加號碼到文件被保存
實施例:截圖1,截圖2,截圖3,截圖4等
顯然,這可以被應用到其他文件被保存。有任何想法嗎?謝謝。
我已經創建了一個截圖程序,所有工作都很好。唯一的問題是,我不知道如何使它成爲截圖保存附加數字。C# - 添加號碼到文件被保存
實施例:截圖1,截圖2,截圖3,截圖4等
顯然,這可以被應用到其他文件被保存。有任何想法嗎?謝謝。
下面是我經常用於這種情況的方法。只是通過像「屏幕截圖」的字符串,它會發現在「截圖[數字]」的格式最低的可用文件名(或只是「截圖」如果沒有任何的話):
private string GetUniqueName(string name, string folderPath)
{
string validatedName = name;
int tries = 1;
while (File.Exists(folderPath + validatedName))
{
validatedName = string.Format("{0} [{1}]", name, tries++);
}
return validatedName;
}
(注意:這是一個稍微簡化的版本,不考慮文件擴展名)。
謝謝!這正是我需要的。完善它如何檢查最低的可用文件名,意味着將其置於問題中。先生非常感謝您。 – user 2009-10-08 01:05:28
我會用'Path.Combine(folderPath,validatedName)'代替'folderPath + validatedName'。 – 2010-09-15 20:51:04
莎拉是對的。沒有Path.Combine(folderPath,validatedName)它將永遠不會工作,因爲它會將文件夾名稱作爲文件名的一部分。 我已經把最初由Rex M提出的正確的代碼塊放在下面。 – Rahatur 2013-07-17 17:57:37
由於您正在編寫這些文件,因此一種方法是搜索當前的保存目錄並查找名爲ScreenshotXX的最新文件,然後使用正則表達式從名稱中獲取編號。
您可以使用DirectoryInfo
類以及Regex
類。
這很容易中斷。如果用戶創建一個具有其中一個屏幕截圖文件名稱的文件,該怎麼辦?如果用戶編輯舊的屏幕截圖文件會怎麼樣?解決方案需要檢查每個文件的存在性,直到找到「缺口」。 – jnylen 2009-10-08 12:04:31
@jnylen:如果用戶創建一個具有其中一個屏幕截圖文件名稱的文件,該怎麼辦? >>您不能擁有兩個具有相同名稱的文件。 如果用戶編輯舊屏幕截圖文件會怎麼樣? >>編輯文件無關緊要,因爲它不會修改創建日期。 解決方案需要檢查每個文件的存在性,直到找到「間隙」。 >>夠正確。但是,如果它不能寫入文件(因爲它存在),它應該增加數字直到它可以寫入。我不認爲尋找差距是一個好主意,因爲如果你有SS1,SS3,SS4,最新的截圖將是SS2? – Alan 2009-10-08 16:57:40
的溶液摘要
這樣可以幫你嗎?
你有使用數字的原因嗎?相同的文件夾會在以後重新用於其他會話嗎?如果日期不同,數字是否應重新啓動並替換現有文件?
這些是需要牢記的事情。值得一提的是,OS X在做屏幕截圖時用來提供「圖片1」,「圖片2」,幸好它現在使用的新版本是「2009-12-08在11.35.12拍攝的截圖」或類似的東西,允許按日期排序更容易,輕鬆避免命名衝突等。
在其他建議中發佈時,您仍然需要檢查文件是否已存在,以及重試時間DateTime.Now將不同,因此文件名會有所不同。當然,除非屏幕截圖處於相同的毫秒級別,否則用戶無法使用日期/時間(或者夏令時也會讓您感到困擾),否則不應該發生任何衝突。
目前,這些文件是使用時間戳保存的。但有些人問我是否可以在文件名末尾添加一個數字,如果他們選擇要保存的文件。我很欣賞你的建議。 – user 2009-10-08 01:15:29
在這種情況下,你有兩個選擇,要麼循環使用File.Exists檢查每個連續的數字(快速和髒)或獲得一個文件列表,並找到最大的數字,並添加1.取決於你想要做什麼,如果有人「截圖1「,」屏幕截圖2「,」屏幕截圖33「假設他們刪除了一堆之間,下一個應該是3還是34? – 2009-10-09 00:50:03
這是我使用:
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); string newPath; List<string> files = new List<string>(Directory.GetFiles(path,"*.txt",SearchOption.TopDirectoryOnly)); for(int i=0; files.Contains(newPath=string.Format(path + @"\textfile{0}.txt",i)); i++) { Console.WriteLine("File:{0} exist skipping....", newPath); } File.WriteAllText(newPath,"dummy");
這裏是最初提出一個精解由雷克斯M.它會生成文件名作爲被要求在實際的問題:
public string GetUniqueName(string name, string folderPath)
{
string pathAndFileName = Path.Combine(folderPath, name);
string validatedName = name;
int count = 1;
while(File.Exists(Path.Combine(folderPath, validatedName)))
{
validatedName = string.Format("{0}{1}{2}",
Path.GetFileNameWithoutExtension(pathAndFileName),
count++,
Path.GetExtension(pathAndFileName));
}
return validatedName;
}
也許您可以向我們展示您迄今爲止編寫的代碼... – 2009-10-08 00:49:46