2009-10-08 19 views
6

Stworzyłem program zrzutowy i wszystko działa świetnie. Jedyny problem polega na tym, że nie jestem pewien, jak mogę to zrobić, więc zrzuty ekranu są zapisywane z dodanymi liczbami.C# - Dołącz numer do pliku Zapisany

Przykład: Video 1 ekranu 2, ekranu 3 ekranu 4, itd

Oczywiście mogą być zastosowane do innych plików zapisywane. Jakieś pomysły? Dziękuję Ci.

+0

Może możesz pokazać nam kod, który napisałeś do tej pory ... –

Odpowiedz

10

Oto metoda, której często używam w tym przypadku. Wystarczy przejść na sznurku jak „Screen” i znajdzie najniższą dostępną nazwę pliku w formacie „Screenshot [numer]” (lub po prostu „Zrzut ekranu”, jeśli nie ma już w ogóle):

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; 
} 

(Uwaga: jest to wersja nieco uproszczona, która nie uwzględnia rozszerzeń plików).

+1

Dzięki! Dokładnie tego potrzebuję. Doskonale sprawdza, jak sprawdza najniższą dostępną nazwę pliku, aby umieścić to w pytaniu. Dziękuję Panu bardzo. – user

+2

Użyłbym 'Path.Combine (folderPath, validatedName)' zamiast 'folderPath + validatedName'. –

+0

Sara ma rację. Bez ścieżki Path.Combine (folderPath, validatedName) nigdy nie zadziała, ponieważ zajmie nazwę folderu jako część nazwy pliku. Położyłem poprawiony blok kodu poniżej początkowo proponowany przez Rex M. – Rahatur

0

Od chwili zapisywania plików, jednym z podejść jest przeszukanie bieżącego katalogu zapisu i odnalezienie najnowszego pliku o nazwie ScreenshotXX, a następnie użycie wyrażenia regularnego w celu uzyskania numeru od nazwiska. Można używać klasy DirectoryInfo wraz z klasą Regex.

+0

To może łatwo zepsuć. Co się stanie, jeśli użytkownik utworzy plik, który ma nazwę jednego z plików zrzutu ekranu? Co się stanie, jeśli użytkownik zmieni stary plik zrzutu ekranu?Rozwiązanie musi sprawdzić istnienie każdego pliku, dopóki nie znajdzie "luki". – jnylen

+0

@jnylen: Co jeśli użytkownik utworzy plik, który ma nazwę jednego z plików zrzutu ekranu? >> Nie można mieć dwóch plików o identycznych nazwach. Co zrobić, jeśli użytkownik edytuje stary plik zrzutu ekranu? >> Edycja pliku nie ma znaczenia, ponieważ nie zmienia daty utworzenia. Rozwiązanie musi sprawdzić istnienie każdego pliku, dopóki nie znajdzie "luki". >> To prawda. Jeśli jednak nie może zapisać pliku (ponieważ istnieje), powinien zwiększyć liczbę, dopóki nie będzie mógł napisać. Nie wydaje mi się, że szukanie luki jest dobrym pomysłem, ponieważ jeśli masz SS1, SS3, SS4, najnowszym zrzutu będzie SS2? – Alan

0

podsumowanie rozwiązania

  1. Directory.GetFiles (docelowy);
  2. sortować pliki nazwy
  3. analizować ostatnią nazwę pliku, znaleźć ostatni numer użyty
  4. zapisu następny plik z następnego numeru załączonym do niego.

Czy to zadziałałoby dla Ciebie?

3

Czy istnieje powód, dla którego używasz liczb? Czy ten sam folder zostanie ponownie użyty później w innej sesji? Czy numery powinny zostać ponownie uruchomione i zastąpić istniejące, jeśli dzień jest inny?

Są to rzeczy, o których należy pamiętać. Warto zauważyć, że OS X używał podczas tworzenia zrzutów ekranowych "Obraz 1", "Obraz 2" i na szczęście w nowej wersji używa teraz "Zrzutu wykonanego w dniu 2009-12-08 na 11.35.12" lub czegoś podobnego, pozwalając łatwiejsze sortowanie według daty, łatwe unikanie konfliktów nazw itp.

Zgodnie z innymi sugestiami nadal musisz sprawdzić, czy plik już istnieje, i kiedy ponowisz próbę DateTime.Now będzie inna, więc nazwa pliku będzie inna. Oczywiście nie powinieneś mieć żadnych konfliktów, chyba że zrzuty ekranu są w tej samej milisekundy lub użytkownik wpada w oko z datą/czasem (lub oszczędności w świetle dziennym również mogą Cię zaniepokoić).

+1

Obecnie pliki są zapisywane przy użyciu znacznika czasu. Ale niektórzy ludzie pytali mnie, czy mogę dołączyć opcję, która dodaje numer na końcu nazwy pliku, jeśli tak wybiera plik do zapisania. Doceniam twoją sugestię. – user

+0

W takim przypadku masz dwie opcje, albo zapętlanie za pomocą File.Exists sprawdza z każdym kolejnym numerem (szybkie i brudne) lub uzyskać listę plików i znaleźć największą liczbę i dodać 1. Zależy, co chcesz zrobić, jeśli ktoś ma "Screenshot 1 "," Zrzut ekranu 2 "," Zrzut ekranu 33 ", zakładając, że usunęli grupę pośrednią, czy następna powinna być 3 czy 34? –

0

To co mam użyć:

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");

2

Oto wyrafinowane rozwiązanie początkowo zaproponowany przez Rex M. Będzie generowania nazw plików, jak został poproszony w rzeczywistej pytanie:

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; 
}