我有两个脚本,一个在 Python 中,一个在 Powershell 中,它们获取并比较文件的最后修改。 Powershell 中的一个使用:
$t = $f.LastWriteTime.ToFileTimeUtc()
这次对我来说很重要,我需要用 Python 获取相同的信息。我正在使用 os.stat 并使用以下公式将 UNIX 时间戳转换为“Windows 文件时间”*:
statinfo = os.stat(file_name)
t = long(statinfo.st_mtime * 10000000L) + 11644473600L * 10000000L
但是,我遇到了舍入误差的问题。 st_mtime 是一个 float ,当我将它相乘并转换为 long 时,我失去了精度——通常误差小于 10(即小于 1 毫秒)。我当然可以修复我的程序,以便它在这个精度内比较数字,但我更希望有相同的数字。
这里有一个关于 SO 的类似问题:How do I get *change* file time in Windows?据我所知,我必须访问结构 FILE_BASIC_INFORMATION ( http://msdn.microsoft.com/en-us/library/windows/hardware/ff545762(v=vs.85).aspx ),但是我不确定如何在不使用 IronPython、PyWin 或类似的 Python 扩展的情况下进行访问。是否有一种简单的方法(可能使用 ctypes)来访问此信息?
*Windows 文件时间是一个 64 位值,表示自公元 1601 年 1 月 1 日午夜 12:00 协调世界时 (UTC) 以来经过的 100 纳秒间隔的数量。参见 https://msdn.microsoft.com/en-us/library/system.datetime.tofiletimeutc(v=vs.110).aspx
最佳答案
所以,为了任何有这个问题的人的利益。其实,原来我提的问题,How do I get *change* file time in Windows? , 有点误导,因为它提到了一个晦涩的驱动程序访问功能 ZwQueryInformationFile,而您可以使用简单的 GetFileTime 功能。无论哪种方式,这些函数都需要文件句柄,而这又需要调用 CreateFile 和 CloseHandle,对于大量文件(在我的例子中大约是一百万),这是非常昂贵的。所以最后我使用了只需要路径的GetFileAttributesExW。根据我的测量,这仍然比 os.stat 慢一点(大约 10%),我认为这是通过 ctypes 调用函数的开销。
因此,在从 Internet 上进行一些复制粘贴后,我将以下代码放在一起,它们完全符合我的要求。
from ctypes import windll, Structure, byref
from ctypes.wintypes import LPWSTR, DWORD, FILETIME
class WIN32_FILE_ATTRIBUTE_DATA(Structure):
_fields_ = [("dwFileAttributes", DWORD),
("ftCreationTime", FILETIME),
("ftLastAccessTime", FILETIME),
("ftLastWriteTime", FILETIME),
("nFileSizeHigh", DWORD),
("nFileSizeLow", DWORD)]
filename = 'path and file name'
wfad = WIN32_FILE_ATTRIBUTE_DATA()
GetFileExInfoStandard = 0
windll.kernel32.GetFileAttributesExW(LPWSTR(filename), GetFileExInfoStandard, byref(wfad))
lowtime = long(wfad.ftLastWriteTime.dwLowDateTime)
hightime = long(wfad.ftLastWriteTime.dwHighDateTime)
filetime = (hightime << 32) + lowtime
print filetime
关于python - 在 Windows 上的 Python 中获取上次更改时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38508351/
如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url