Dołącz znacznik czasu do nazwy pliku

118

Kilkakrotnie spotkałem się z tym problemem, w którym chciałbym mieć wiele wersji tego samego pliku w tym samym katalogu. Sposób, w jaki robiłem to za pomocą C #, polega na dodaniu znacznika czasu do nazwy pliku za pomocą czegoś takiego DateTime.Now.ToString().Replace('/', '-').Replace(':', '.'). Czy jest lepszy sposób, aby to zrobić?

znak
źródło

Odpowiedzi:

260

Możesz użyć metody DateTime.ToString (String)

DateTime.Now.ToString("yyyyMMddHHmmssfff")

lub string.Format

string.Format("{0:yyyy-MM-dd_HH-mm-ss-fff}", DateTime.Now);

lub ciągi interpolowane

$"{DateTime.Now:yyyy-MM-dd_HH-mm-ss-fff}"

Istnieją następujące specyfikatory formatu niestandardowego y (rok), M (miesiąc), d (dzień), h (godzina 12), H (godzina 24), m (minuta), s (sekunda), f (drugi ułamek), F (drugi ułamek, końcowe zera są obcinane), t (PM lub AM) i z (strefa czasowa).

Z metodą rozszerzenia

Stosowanie:

string result = "myfile.txt".AppendTimeStamp();
//myfile20130604234625642.txt

Metoda przedłużania

public static class MyExtensions
{
    public static string AppendTimeStamp(this string fileName)
    {
        return string.Concat(
            Path.GetFileNameWithoutExtension(fileName),
            DateTime.Now.ToString("yyyyMMddHHmmssfff"),
            Path.GetExtension(fileName)
            );
    }
}
Damith
źródło
1
Dodałem, Path.GetDirectoryName(fileName)aby uzyskać pełną ścieżkę do pliku. Wtedy otrzymuje string.Concat()z Path.Combine()tym uzyskać pełny nazw.
gilu
17

Wolę używać:

string result = "myFile_" + DateTime.Now.ToFileTime() + ".txt";

Co robi ToFileTime ()?

Konwertuje wartość bieżącego obiektu DateTime na czas pliku systemu Windows.

public long ToFileTime()

Czas pliku systemu Windows to 64-bitowa wartość, która reprezentuje liczbę 100-nanosekundowych interwałów, które upłynęły od północy 1 stycznia 1601 AD (CE) Coordinated Universal Time (UTC). System Windows wykorzystuje czas pliku do rejestrowania, kiedy aplikacja tworzy, uzyskuje dostęp lub zapisuje do pliku.

Źródło: dokumentacja MSDN - metoda DateTime.ToFileTime

Reklamy
źródło
10

Być może DateTime.Now.Tickszamiast tego dołączanie jest trochę szybsze, ponieważ nie będziesz tworzyć 3 ciągów, a wartość ticków również zawsze będzie unikalna.

Ikar
źródło
2

możesz użyć:

Stopwatch.GetTimestamp();
Józefa
źródło
ta odpowiedź w sposób, w jaki otrzymujesz znacznik czasu !. dołącz go do pliku za pomocą klasy Path, a operowanie na ciągach znaków nie stanowi żadnego problemu. to tylko alternatywa dla metody DateTime.ToString (String) lub string.Format ("{0: rrrr-MM-dd_hh-mm-ss-tt}", DateTime.Now);
Joseph
1

Zamiast tego możesz użyć poniżej:

DateTime.Now.Ticks
gokul
źródło
1

Dla Bieżąca data i godzina jako nazwa pliku w systemie plików. Teraz wywołaj metodę string.Format i połącz ją z DateTime.Now, aby uzyskać metodę, która generuje poprawny ciąg na podstawie daty i godziny.

using System;
using System.IO;

class Program
{
    static void Main()
    {
        //
        // Write file containing the date with BIN extension
        //
        string n = string.Format("text-{0:yyyy-MM-dd_hh-mm-ss-tt}.bin",
            DateTime.Now);
        File.WriteAllText(n, "abc");
    }
}

Wynik :

C:\Users\Fez\Documents\text-2020-01-08_05-23-13-PM.bin

"text-{0:yyyy-MM-dd_hh-mm-ss-tt}.bin"

tekst - pierwsza część wymaganych plików wyjściowych będzie zaczynać się od tekstu-

{0: Wskazuje, że jest to symbol zastępczy ciągu. Zero wskazuje indeks parametrów wstawionych w tym miejscu

rrrr- Drukuje rok za pomocą czterech cyfr, po których następuje myślnik. Problem dotyczy „roku 10000”

MM- Drukuje miesiąc za pomocą dwóch cyfr

dd_ Drukuje dzień za pomocą dwóch cyfr, po których następuje podkreślenie

hh- Drukuje godzinę za pomocą dwóch cyfr

mm- Drukuje minuty, również w postaci dwóch cyfr

ss- Zgodnie z oczekiwaniami wypisuje sekundy

tt Drukuje AM lub PM w zależności od pory dnia

Fezal halai
źródło