Milisaniye cinsinden dosya oluşturma zamanını alın


13

Pencerelerde daha yüksek doğrulukta bir dosya oluşturma süresi elde etmenin bir yolu var mı? Milisaniye cinsinden bir mp4 videonun oluşturulma zamanını almak istiyorum. Mümkün mü?


Bu doğruluğa neden ihtiyacınız olduğunu sormalıyım?
Moab

1
Bir video ile birlikte bir Android cihazına bazı sensör verilerini kaydediyorum. Sensör kaydını kendim yazdım ve her bir sensör değeri ile birlikte sistem saatini kaydettim. Video kaydetmek için standart kamera etkinliğini kullanıyorum. Verileri bir PC'ye gönderdikten sonra analiz etmek istiyorum. Videoyu sensör verileriyle birleştirmek için videonun ne zaman başladığını bilmeliyim. Saniye biraz fazla kaba olduğundan videonun daha kesin bir başlangıç ​​zamanını elde etmenin bir yolunu arıyorum.
Phil

3
Not: İki veri akışı arasında bu tür bir ilişkiye ihtiyacınız varsa, genellikle akışa bir kayıt sinyali koymak önemlidir (yönetmen "eylem" olarak adlandırdığı için filmlerde kullanılan eski fıçı tahtaları gibi). iki veya daha fazla akışın daha sonra senkronize edilmesine olanak tanır). Bazı durumlarda, dosyayı çekirdek modunda oluşturma (ve zaman damgasını kaydetme) ve kullanmak için bir dosya tanıtıcısı olduğunu bildirmek için işleminizi uyandırma arasındaki zaman gecikmesi, verileriniz için sahip olduğunuz toleranslardan daha yüksek olabilir.
Cort Ammon

Eşyalarınızı Android'den başka bir yere kopyaladığınızda, tüm kopyalama araçlarının zaman damgası hassasiyetini koruduğundan emin olun. Birçok kopyalama aracının ctimekopyayı kopyalandığı zaman yapacağını unutmayın.
Peter Cordes

1
Pencerelerde, stat3 zaman damgasını almak için cygwin / mingw kullanırım. Elbette, bunun nedeni normalde GNU / Linux kullanıyorum.
Peter Cordes

Yanıtlar:


23

Zaman damgası çözünürlüğü

Windows'da bir dosyanın oluşturulma zaman damgası dosya sistemine bağlıdır:

  • FAT / VFAT maksimum 2s çözünürlüğe sahiptir

  • NTFS maksimum 100 ns çözünürlüğe sahiptir


wmic çözümü

wmicDosya oluşturma tarihini en yakın mikrosaniye almak için kullanabilirsiniz .

Misal:

F:\test>wmic datafile where name="f:\\test\\test.txt" get creationdate | findstr /brc:[0-9]
20150329221650.080654+060

Oluşturma tarihi 20150329221650.080654+060aşağıdaki biçimde bir zaman damgası vardır:

yyyymmddHHMMSS.xxxxxxsUUU

nerede:

  • yyyy Dört basamaklı yıl (0000 - 9999).

  • mm İki basamaklı ay (01 ila 12).

  • dd Ayın iki basamaklı günü (01'den 31'e kadar).

  • HH 24 saatlik biçimi (00-23) kullanarak günün iki basamaklı saati.

  • MM Saatte iki basamaklı dakika (00 - 59).

  • SS Dakikadaki iki basamaklı saniye sayısı (00 - 59).

  • xxxxxx Saniyedeki altı basamaklı mikrosaniye sayısı (000000 - 999999)

  • sEşgüdümlü Evrensel Zamanlardan (UTC) pozitif veya negatif bir sapmayı belirtmek için artı işareti ( +) veya eksi işareti ( -).

  • UUU Kaynak saat diliminin UTC'den sapma dakika sayısını gösteren üç basamaklı ofset.


stat çözümü

Ayrıca kullanabilirsiniz stat(bir cygwin veya mingw kurulumundan).

Misal:

DavidPostill@Hal /f/test
$ stat test.txt | grep Birth
 Birth: 2015-03-29 22:16:50.080654200 +0100

karşılaştırma için dir çıktı

F:\test>dir /t:c test.txt
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

29/03/2015  22:16                32 test.txt
               1 File(s)             32 bytes
               0 Dir(s)  1,798,546,849,792 bytes free

Daha fazla okuma


@NateEldredge Teşekkürler, iyi tespit ettim. Yanıt düzeltildi.
DavidPostill

4
Dikkat edilmesi gereken bir nokta: Zaman damgalarının 100 nanosaniye rakamı gibi yüksek frekanslı bir rakam içermesi, saatin 100ns aralığında güvenilir bir zaman kaynağı olarak kullanılabileceği anlamına gelmez. Sadece [umarım] monotonik olan ve kabaca "gerçek" zamanla ilişkili olan çok fazla içerik parçası olduğunu belirtir.
Cort Ammon

1
Msdn bakınız CIM_DATETIME : sizin gösterimde, xxxxxxbir saniye (999999 yoluyla 000000) içinde mikrosaniye Altı basamaklı sayı . Mikro- , yani 10^-6. Tabii ki, ilk üçüz mili- ( 10^-3) temsil eder : kesilmiş, yuvarlak değil. Çıkarılan ikinci üçüz kendi içinde hiçbir şeyi temsil etmez ... Ancak, bazı wmitarih değerleri 000her zaman ikinci wmic OS get LocalDateTime
üçlüyü gösterir

1
Teşekkürler, bu tür cevaplar neden yığın alışverişi seviyorum :)
Phil

1
@MarisB. Ah. Yanıt güncellendi.
DavidPostill

1

Burada akıllı bir yol gösterilmektedir: /programming/5180592/showing-ntfs-timestamp-with-100-nsec-granularity

WMI'nın CIM veritabanını sorgulamak ve FILETIMEbir dosyayla ilişkili yapıyı döndürmek için VBScript kullanıyor .

Dijital fotoğraf makineleri tarafından oluşturulan medyanın meta verilerini yönetmeye yönelik EXIFtool gibi bir medya dosyasının meta verilerini inceleyebilen açık kaynaklı araçlar da vardır .


1

Ben Matlab bunu elde etmek için bir yol buldum:

Jan Simon tarafından yazılan GetFileTime işlevini kullanabilirsiniz . Kendi mex dosyalarınızı derlemek istemiyorsanız, derlenmiş dosyaları buradan indirebilirsiniz .

Wmic (sadece ms) kullanmak kadar kesin değildir, ancak benim amacım için uygundur.


-3

Bu dosya sistemine bağlıdır NTFS, FAT 2 saniye çözünürlüğe sahiptir: teorik olarak 100 ns çözünürlüğe sahiptir, ancak gerçek çözünürlük 10 ms . Bununla birlikte, kesintilerin disk G / Ç'den daha yüksek önceliği vardır ve yazma önbelleğinin zaman damgası üzerindeki etkisinden emin değilim. Multimedya zamanlayıcıları doğruluk için optimize edilmiştir, bu nedenle zamanlamayı uygulamanın tercih edilen yolu olacaktır.

Yüksek çözünürlüklü zaman damgalarını görüntülemek için XYplorer gibi mevcut bir aracı kullanabilir veya XYplorer gösteren mskendi uygulamanızı yazmayı tercih edebilirsiniz. File.GetCreationTime Yöntemini kullanın ; Milisaniye özelliğine sahip bir DateTime yapısı döndürür .


1
um ... kaba olmamak ama @ DavidPostill'in cevabını okudun mu?
td512

2
"NTFS teorik olarak 100 ns çözünürlüğe sahiptir, ancak gerçek çözünürlük 10 ms'dir " yanlıştır - bu bağlantı aslında " NT FAT üzerinde oluşturma süresi 10 milisaniyelik bir çözünürlüğe sahiptir " der . Yani yapar değil ortalama NTFS o çözünürlüğe sahiptir. Cevabımdan görebileceğiniz gibi, NTFS'de wmicen yakın mikrosaniye bir çözünürlük gösteriyor .
DavidPostill

Teorik ve maksimum çözünürlük arasında bir fark vardır, biri maksimum çözünürlüğü iyi gösterir, diğeri daha fazla ortalama çözünürlüğü gösterir.
Ramhound

1
@DavidPostill Saat yalnızca her 10 ms'de bir zamanı arttırırsa, 100ns'i temsil edebilen bir datetime dosyasının olması hala sadece 10ms'lik bir doğruluğa sahiptir. Tipik UtcNow API'leri (zaman farklarını ölçmek için tasarlanan yüksek performanslı sayaçların aksine ) pencerelerde her 0.5-16ms'lik süreyi arttırır, bu nedenle bu cevap oldukça mantıklıdır.
CodesInChaos

@CodesInChaos Evet, ancak - "Sistem saatini almak için en iyi kaynak GetSystemTimeAsFileTime API'sidir. Bağımsız değişkenlerinde yeterince doğru (100 ns birim) değer tutabilen hızlı erişim API'sıdır." - Windows kaynak koduna erişimim yok, bu yüzden dosya zaman damgalarını işlerken başlık altında hangi çağrıların kullanıldığını bilmiyorum. Gerçek çözünürlüğün ne olduğunu bilmiyoruz - bu sadece tahmin ediyor.
DavidPostill
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.