عدم الاتساق في الوقت المعدل/الذي تم إنشاؤه/الوصول إليه على Mac

StackOverflow https://stackoverflow.com/questions/2479690

  •  21-09-2019
  •  | 
  •  

سؤال

أواجه مشكلة في استخدام os.utime لتعيين وقت التعديل بشكل صحيح على Mac (Mac OS X 10.6.2 ، تشغيل Python 2.6.1 من /usr/bin/python). لا يتفق مع touch الأداة المساعدة ، وهي لا تتفق مع الخصائص المعروضة في نافذة "الحصول على المعلومات" الخاصة بـ Finder.

النظر في تسلسل الأمر التالي. تشير الأوقات "التي تم إنشاؤها" و "المعدلة" في النص العادي إلى السمات الموضحة في نافذة "Get Info" في الباحث. للتذكير، OS.UTIME يأخذ الحجج (filename, (atime, mtime)).

>>> import os
>>> open('tempfile','w').close()

"تم إنشاؤه" و "المعدل" هما الوقت الحالي.

>>> os.utime('tempfile', (1000000000, 1500000000) )

"تم إنشاؤه" هو الوقت الحالي ، "المعدل" هو 13 يوليو 2017.

>>> os.utime('tempfile', (1000000000, 1000000000) )

"تم إنشاؤها" و "تعديل" كلاهما في 8 سبتمبر 2001.

>>> os.path.getmtime('tempfile')
1000000000.0
>>> os.path.getctime('tempfile')
1269021939.0
>>> os.path.getatime('tempfile')
1269021951.0

...لكن ال os.path.get?time و os.stat لا تعكس ذلك.

>>> os.utime('tempfile', (1500000000, 1000000000) )

"تم إنشاؤها" و "تعديل" ما يزال كلا 8 سبتمبر 2001.

>>> os.utime('tempfile', (1500000000, 1500000000) )

"تم إنشاؤه" في 8 سبتمبر 2001 ، "Modified" هو 13 يوليو 2017.

لست متأكدًا مما إذا كانت هذه مشكلة Python أو مشكلة Mac Stat. عندما أخرج من قذيفة بيثون وأركض

touch -a -t 200011221234 tempfile

لا يتم تغيير التعديل ولا أوقات الخلق ، كما هو متوقع. ثم أركض

touch -m -t 200011221234 tempfile

ويتم تغيير كل من الأوقات "التي تم إنشاؤها" و "تعديل".

هل لدى أي شخص أي فكرة عما يحدث؟ كيف يمكنني تغيير أوقات التعديل والخلق باستمرار على جهاز Mac؟ (نعم ، أنا أدرك أنه على أنظمة Unixy لا يوجد "وقت إنشاء".)


ناتج عن تشغيل نص كريس جونسن:

seth@local:~$ /usr/bin/python timetest.py tempfile 5
initial:
(1269631281.0, 1269631281.0, 1269631281.0, 1269631281, 1269631281, 1269631281)

test: (1000000000, 1000000000)
(1000000000.0, 1000000000.0, 1269631281.0, 1000000000, 1000000000, 1269631281)
(1269631281.0, 1000000000.0, 1269631281.0, 1269631281, 1000000000, 1269631281)

test: (1000000000, 1500000000)
(1000000000.0, 1500000000.0, 1269631286.0, 1000000000, 1500000000, 1269631286)
(1269631286.0, 1500000000.0, 1269631286.0, 1269631286, 1500000000, 1269631286)

test: (1500000000, 1000000000)
(1500000000.0, 1000000000.0, 1269631291.0, 1500000000, 1000000000, 1269631291)
(1269631291.0, 1000000000.0, 1269631291.0, 1269631291, 1000000000, 1269631291)

test: (1500000000, 1500000000)
(1500000000.0, 1500000000.0, 1269631296.0, 1500000000, 1500000000, 1269631296)
(1269631296.0, 1500000000.0, 1269631296.0, 1269631296, 1500000000, 1269631296)

في نهاية التمرين ، يكون تاريخ "تم إنشاؤه" كما هو واضح في الباحث هو 9/8/01 وتاريخ "المعدل" هو 7/13/17. (تاريخ الوصول ، وذلك بفضل الأضواء الكبرية المفترضة كما تقترح وكما قرأت ، هو "الآن".) التواريخ التي تم إنشاؤها والمعدل المرئية في الباحث لا معنى لها.

هل كانت مفيدة؟

المحلول

Posix وقت, MTIME, ctime

قد يساعد ذلك إذا قمت بتضمين برنامج نصي كامل ومخرجاته الفعلية والمتوقعة بدلاً من شظايا الاستبدال.

import sys, os, stat, time

def get_times(p):
    s = os.stat(p)
    return ( 
        os.path.getatime(p),
        os.path.getmtime(p),
        os.path.getctime(p),
        s[stat.ST_ATIME],
        s[stat.ST_MTIME],
        s[stat.ST_CTIME],
    )

def main(p, delay=1):
    delay = float(delay)
    (a,b) = (1000000000, 1500000000)

    open(p,'w').close()

    print 'initial:'
    print get_times(p)

    for t in [ (a,a), (a,b), (b,a), (b,b) ]:
        print
        print 'test:', t
        os.utime(p,t)
        print get_times(p)
        time.sleep(delay)
        print get_times(p)

main(*sys.argv[1:])

أحصل على هذا على نظام 10.4 مع cd "$HOME" && python test.py tempfile 5 (النظام الافتراضي Python 2.3.6 و Macports Python 2.6.4 يعطي كلاهما نفس النتيجة (ترك الأوقات الأولية و ctime, ، بالتاكيد)):

% python /tmp/test.py tempfile 5
initial:
(1000000000.0, 1000000000.0, 1269629881.0, 1000000000, 1000000000, 1269629881)

test: (1000000000, 1000000000)
(1000000000.0, 1000000000.0, 1269629881.0, 1000000000, 1000000000, 1269629881)
(1000000000.0, 1000000000.0, 1269629881.0, 1000000000, 1000000000, 1269629881)

test: (1000000000, 1500000000)
(1000000000.0, 1500000000.0, 1269629886.0, 1000000000, 1500000000, 1269629886)
(1000000000.0, 1500000000.0, 1269629886.0, 1000000000, 1500000000, 1269629886)

test: (1500000000, 1000000000)
(1500000000.0, 1000000000.0, 1269629891.0, 1500000000, 1000000000, 1269629891)
(1500000000.0, 1000000000.0, 1269629891.0, 1500000000, 1000000000, 1269629891)

test: (1500000000, 1500000000)
(1500000000.0, 1500000000.0, 1269629896.0, 1500000000, 1500000000, 1269629896)
(1500000000.0, 1500000000.0, 1269629896.0, 1500000000, 1500000000, 1269629896)

هذا يبدو معقولًا. أتساءل ماذا تحصل.

لقد سمعت أن الأضواء يمكن أن تعيد التعيين بقوة في بعض الأحيان وقت بسبب إعادة الفهرسة تم تغيير الملفات. لا أتوقع من إعادة الفهرس ملفًا خضع فقط UTIME ()/UTIMES () ، لكنني أفترض أنه ممكن. للتخلص من الأضواء كمضاعفات محتملة ، استخدم ملفًا في موقع لم يتم فهرسته بواسطة Spotlight (على سبيل المثال /TMP /TestFile).

التاريخ الذي تم إنشاؤه في الباحث

(يظهر على أنه "تم إنشاؤه:" في Get Info Windows of Finder)

إذا تم تثبيت أدوات المطورين ، فيمكنك الاستخدام /Developer/Tools/GetFileInfo لرؤية HFS CreationDate. أضفت الأسطر التالية بعد كل print get_times(p) خط:

sys.stdout.flush()
os.system('/Developer/Tools/GetFileInfo ' + p)

لقد قمت أيضًا بتغيير التكرار لمطابقة وصفك الأولي ([ (a,b), (a,a), (b,a), (b,b) ]).

تبدو النتيجة الآن هكذا:

% rm /tmp/tempfile; python /tmp/test.py /tmp/tempfile 1
initial:
(1269636574.0, 1269636574.0, 1269636574.0, 1269636574, 1269636574, 1269636574)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 03/26/2010 15:49:34
modified: 03/26/2010 15:49:34

test: (1000000000, 1500000000)
(1000000000.0, 1500000000.0, 1269636574.0, 1000000000, 1500000000, 1269636574)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 03/26/2010 15:49:34
modified: 07/13/2017 21:40:00
(1000000000.0, 1500000000.0, 1269636574.0, 1000000000, 1500000000, 1269636574)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 03/26/2010 15:49:34
modified: 07/13/2017 21:40:00

test: (1000000000, 1000000000)
(1000000000.0, 1000000000.0, 1269636576.0, 1000000000, 1000000000, 1269636576)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 09/08/2001 20:46:40
(1000000000.0, 1000000000.0, 1269636576.0, 1000000000, 1000000000, 1269636576)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 09/08/2001 20:46:40

test: (1500000000, 1000000000)
(1500000000.0, 1000000000.0, 1269636577.0, 1500000000, 1000000000, 1269636577)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 09/08/2001 20:46:40
(1500000000.0, 1000000000.0, 1269636577.0, 1500000000, 1000000000, 1269636577)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 09/08/2001 20:46:40

test: (1500000000, 1500000000)
(1500000000.0, 1500000000.0, 1269636578.0, 1500000000, 1500000000, 1269636578)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 07/13/2017 21:40:00
(1500000000.0, 1500000000.0, 1269636578.0, 1500000000, 1500000000, 1269636578)
file: "/private/tmp/tempfile"
type: ""
creator: ""
attributes: avbstclinmedz
created: 09/08/2001 20:46:40
modified: 07/13/2017 21:40:00

يبدو أن هذا يتفق مع ملاحظاتك من نافذة GET INFO الباحث. إن تفسيري (التي تنشئها تجربة أخرى) هو أن CreationDate HFS يتم تحديثه بواسطة UTIME ، لكنه يعود إلى الوراء (لا تُفهم أبدًا). إذا كنت ترغب في تحديث CreateDate HFS إلى قيمة أحدث ، فربما يتعين عليك استخدام واجهة برمجة تطبيقات خاصة Mac للقيام بذلك.

ملاحظة أخرى: قد تضطر إلى تبديل Windows قليلاً للحصول على يحصل على معلومات نافذة للتحديث. على نظامي ، لا يتم تحديث الشاشة تلقائيًا إلا إذا قمت بتبديل Windows إما إلى أو من نافذة Get Info.

نصائح أخرى

يحتفظ Mac OS بسمات إضافية لا تخطط لـ Posix.

  • أنشأت
  • contentModdate
  • stribtemoddate
  • تاريخ الوصول
  • Backupdate

اعتدت أن تكون قادرًا على الوصول إلى هذه من خلال وحدة MACFS القديمة ، والتي تم إهمالها منذ فترة طويلة لصالح وحدة الكربون ، والتي لا تحمل موثقة إلى حد كبير ، كما تم إهمالها الآن. أعتقد أن الكربون. (لا أتابع Mac بما يكفي لمعرفة الخطة الحالية لهذه الميزات. ربما يتم سحب الكربون من stdlib ، وسوف تستمر بمفرده.)

ربما يساعد التعليق الذي يوضح ما تبحث عنه ، بدلاً من التصويت السفلي

لست متأكدًا تمامًا من الاتساق الآخر الذي تتوقعه. يستخدم Python واجهة برمجة تطبيقات POSIX ، وتستخدم أدوات Apple API من Apple. يبدو أن كل واحد متسق داخليًا ، لكن يمكن أن يختلف بين بعضهم البعض.

  • يتم تعيين DetributeModdate إلى ctime.
  • CreatedAte هو ما يعرضه Finder لـ "تم إنشاؤه"
  • إذا قمت بتغيير MTIME إلى وقت سابق من CreatedAte ، فسيقوم واجهة برمجة تطبيقات نظام ملفات MAC بتغيير The Createdate للمطابقة ؛ مما يمنع عدم الاتساق من التعديل الواضح قبل الخلق. هذا يعالج السلوك الوحيد غير المتسق الذي يمكنني جمعه من مثالك أعلاه.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top