Название: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 24, 2012, 17:16 Помогите разобраться с проблемой. Есть программа (win32), которая хранит в бинарном файле время последнего изменения нескольких файлов. Требуется этот бинарник сформировать в Linux. Файло формируется, но есть один затык, а именно - время модификации файлов, которое пишется в данный файл. Почему-то в Linux оно иногда (половина файлов норм время выдают) отличается, причём ровно на 1 секунду. Время получаю так:
Код
Но дело вряд ли в Qt. В консоли, с помощью stat file.ext получаю тот же эффект. Хотя виндовая прога, будучи запущенной через wine, на том же файле показывает время, отличающееся на одну секунду. Кто-нибудь знает, как побороть? Название: Re: FILETIME (Win) и Linux Отправлено: V1KT0P от Март 24, 2012, 18:00 Помогите разобраться с проблемой. Есть программа (win32), которая хранит в бинарном файле время последнего изменения нескольких файлов. Требуется этот бинарник сформировать в Linux. Файло формируется, но есть один затык, а именно - время модификации файлов, которое пишется в данный файл. Почему-то в Linux оно иногда (половина файлов норм время выдают) отличается, причём ровно на 1 секунду. Время получаю так: Ничего не понял.Код
Но дело вряд ли в Qt. В консоли, с помощью stat file.ext получаю тот же эффект. Хотя виндовая прога, будучи запущенной через wine, на том же файле показывает время, отличающееся на одну секунду. Кто-нибудь знает, как побороть? Название: Re: FILETIME (Win) и Linux Отправлено: Bepec от Март 24, 2012, 18:14 Бгг. Добрый человек под разными операционками пытается получить одно время, причем используя эмуляцию систем...
Да вы истинный извращенец :) Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 24, 2012, 18:16 Win32 прога смотрит время модификации файлов и складывает их в бинарный файл. Моя прога (QT, Linux) считывает это время и сравнивает с временем, полученным уже в Linux. Например, в бинарнике записано:
129435156460000000. По формуле, приведённой выше, я получаю 02-03-2011 11:00:46. Запускаю вин-прогу под wine'ом и на этом же файле получаю такую же дату и время. А вот когда я делаю в своей программе: Код
То получаю 02-03-2011 11:00:47 Тудыть его!!! Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 24, 2012, 18:19 Бгг. Добрый человек под разными операционками пытается получить одно время, причем используя эмуляцию систем... Эмуляция используется только на период "изготовления" рабочего кода. Как только добьюсь приемлемого результата, то сразу забуду об wine. Зуб даю! Так что никакого изврата. Но скажите мне пожалуйста, как виндовая прога под эмулем получает то, что мне надо получить без эмуля? Откуда она вынимает это время? Файло одно и то же, файловая система на разделе ext3.Да вы истинный извращенец :) Название: Re: FILETIME (Win) и Linux Отправлено: V1KT0P от Март 24, 2012, 18:20 Win32 прога смотрит время модификации файлов и складывает их в бинарный файл. Моя прога (QT, Linux) считывает это время и сравнивает с временем, полученным уже в Linux. Например, в бинарнике записано: Зачем какие-то формулы, деления и т.д. Чем тебе не угодил Unix TimeStamp?129435156460000000. По формуле, приведённой выше, я получаю 02-03-2011 11:00:46. Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 24, 2012, 18:24 Зачем какие-то формулы, деления и т.д. Чем тебе не угодил Unix TimeStamp? Мне требуется сравнить этот самый Unix TimeStamp с тем, что прописано в файле. И если оно отличается, то сформировать файл с обновлёнными данными, который будет потом использоваться на виндовых машинах.Название: Re: FILETIME (Win) и Linux Отправлено: Bepec от Март 24, 2012, 18:30 Он добрый человек. Пытается соединить Windows и Linux. Для него не имеет значения, что файловые системы там разнятся, механизмы и реализации :)
Название: Re: FILETIME (Win) и Linux Отправлено: V1KT0P от Март 24, 2012, 18:33 Win32 прога смотрит время модификации файлов и складывает их в бинарный файл. Моя прога (QT, Linux) считывает это время и сравнивает с временем, полученным уже в Linux. Например, в бинарнике записано: Ты уверен что в Linux-е время файла измеряется с точностью до миллисекунд. И может эта секунда является округлением онных?129435156460000000. По формуле, приведённой выше, я получаю 02-03-2011 11:00:46. Запускаю вин-прогу под wine'ом и на этом же файле получаю такую же дату и время. А вот когда я делаю в своей программе: Код
То получаю 02-03-2011 11:00:47 Тудыть его!!! Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 24, 2012, 18:36 Он добрый человек. Пытается соединить Windows и Linux. Для него не имеет значения, что файловые системы там разнятся, механизмы и реализации :) Ну сейчас то я нахожусь на одной файловой системе. Или wine, запускаясь, на лету меняет файловую систему раздела? (http://smiles.kolobok.us/icq/biggrin.gif)Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 24, 2012, 18:37 Ты уверен что в Linux-е время файла измеряется с точностью до миллисекунд. И может эта секунда является округлением онных? Если это может сделать эмуль, почему я не могу?Название: Re: FILETIME (Win) и Linux Отправлено: Bepec от Март 24, 2012, 18:39 Эмуль - это ИМИТАЦИЯ. Которая не является 100% копией, а лишь иная программа, подделывающая что-то.
Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 24, 2012, 18:42 Ну эт несущественное замечание. В данном случае эмуль получает на той же файловой системе 46 секунд, а "родная" система выдаёт 47. Откуда она выкапывает одну секунду?
Название: Re: FILETIME (Win) и Linux Отправлено: V1KT0P от Март 24, 2012, 18:48 Ну эт несущественное замечание. В данном случае эмуль получает на той же файловой системе 46 секунд, а "родная" система выдаёт 47. Откуда она выкапывает одну секунду? Выводи время в секундах, может на этапе преобразования в форматированный вид что-то там не так делается(Почитай про время, раз в 4 года високостный год, иногда через какой-то период появляется дополнительная секунда и существует 60 секунд).Название: Re: FILETIME (Win) и Linux Отправлено: Bepec от Март 24, 2012, 18:58 Я лично незнаю ) Попробуй сделать проще. Попроси исходники Windows, возьми исходники Linux. Выдерни из обоих ф-цию получения времени создания файла и сравни. :)
Название: Re: FILETIME (Win) и Linux Отправлено: kambala от Март 24, 2012, 19:02 может все дело в представлении вещественных чисел? где-нибудь накапливается ошибка при операциях с float/double, а потом при округлении вылазит эта секунда.
Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 24, 2012, 19:06 Насколько мне известно, это операции с целочисленными аргументами.
Название: Re: FILETIME (Win) и Linux Отправлено: LisandreL от Март 24, 2012, 19:53 Ну эт несущественное замечание. В данном случае эмуль получает на той же файловой системе 46 секунд, а "родная" система выдаёт 47. Откуда она выкапывает одну секунду? Ну самое банальное предположение: в файловой системе (кстати в какой?) время создания файла: 02-03-2011 11:00:46.873…Windows миллисекунды отбросил, а в Linux округлили. Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 24, 2012, 20:32 В данный момент никакой винды нет, всё происходит на ext3 (Kubuntu 11.10). Поэтому мне непонятны аргументы "Windows миллисекунды отбросил". Если их кто и "отбросил", то это Wine, но тогда возникает вопрос, а откуда он их взял?
И всё-таки, я считаю, что "отброс миллисекунд" это неправильный путь. Подозреваю, что они вообще не участвуют в работе. В бинарнике лежит значение в количестве 100-наносекундных интервалов. При вычислении по формуле (на калькуляторе) дробная часть не вылазит, а стало быть эти миллисекунды и не учитывались изначально. Чую, что копать надо в сторону технологии получения данного времени в Linux, но не силён в этом вопросе. О! Нарыл инфу, что в ext4 используются наносекундные метки. Буду конвертить раздел. (http://smiles.kolobok.us/icq/crazy.gif) Название: Re: FILETIME (Win) и Linux Отправлено: Bepec от Март 25, 2012, 11:09 Уважаемый. Я вам прямо сейчас скажу всё, что вы узнаете в последующие 5 лет, если не будете работать в Microsoft.
Вы никогда не узнаете, как высчитывается время в windows, какие обработки с ним происходят и прочая прочая прочая. Wine - это эмулятор. Это когда человек поработал под виндой и решил сделать "чтобы было похоже". Сами представьте - человек увидел автомобить, решил сделать его подобие. А видел то он только корпус, внутрь заглядывать ему никто не дал(и не даст). Вот с этим вот франкенштейном Linux под названием Wine вы и работаете. PS да и задача у вас какая то бесполезная - нафига вам сотые доли секунды? Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 25, 2012, 14:54 Похоже я нашёл, где собака зарыта. Скорее всего файло меняется на файловой системе FAT. В ней время изменения файла измеряется с точностью до двух секунд. Я обратил внимание, что с файлами, у которых секунды этого времени чётные, проблем нет (и в вин и в лин они дают одинаковые секунды). Сделал так, (на Linux) смотрю время последнего изменения и если секунды нечётные, то просто отнимаю 1 секунду. Вуаля! Благодарю всех за оказанное внимание.
Название: Re: FILETIME (Win) и Linux Отправлено: Bepec от Март 25, 2012, 15:25 Мдамс. Ну хотя б разобрались что нужно от нечётных отнимать. Грац :)
Название: Re: FILETIME (Win) и Linux Отправлено: LisandreL от Март 25, 2012, 17:06 Похоже я нашёл, где собака зарыта. Скорее всего файло меняется на файловой системе FAT. В ней время изменения файла измеряется с точностью до двух секунд. Я обратил внимание, что с файлами, у которых секунды этого времени чётные, проблем нет (и в вин и в лин они дают одинаковые секунды). Сделал так, (на Linux) смотрю время последнего изменения и если секунды нечётные, то просто отнимаю 1 секунду. Вуаля! Благодарю всех за оказанное внимание. Вы учтите, что на настоящей Win сейчас скорее всего будет ntfs и там секунды отбрасываться не будут.Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 25, 2012, 17:11 Дело не в миллисекундах.
Название: Re: FILETIME (Win) и Linux Отправлено: V1KT0P от Март 25, 2012, 17:16 Похоже я нашёл, где собака зарыта. Скорее всего файло меняется на файловой системе FAT. В ней время изменения файла измеряется с точностью до двух секунд. Я обратил внимание, что с файлами, у которых секунды этого времени чётные, проблем нет (и в вин и в лин они дают одинаковые секунды). Сделал так, (на Linux) смотрю время последнего изменения и если секунды нечётные, то просто отнимаю 1 секунду. Вуаля! Благодарю всех за оказанное внимание. Вы учтите, что на настоящей Win сейчас скорее всего будет ntfs и там секунды отбрасываться не будут.Код: Not all file systems can record creation and last access times, and not all file systems record them in the same manner. For example, the resolution of create time on FAT is 10 milliseconds, while write time has a resolution of 2 seconds and access time has a resolution of 1 day, so it is really the access date. The NTFS file system delays updates to the last access time for a file by up to 1 hour after the last access. Название: Re: FILETIME (Win) и Linux Отправлено: Alex Custov от Март 25, 2012, 17:23 Он добрый человек. Пытается соединить Windows и Linux. Для него не имеет значения, что файловые системы там разнятся, механизмы и реализации :) FAT32 в Linux разнится с FAT32 в Windows? Название: Re: FILETIME (Win) и Linux Отправлено: LisandreL от Март 25, 2012, 17:36 Дело не в миллисекундах. Дело в том (если залезть в википедию ;) ), что в fat32 хранит время создания файла с точностью до 2 секунд, а ntfs - с точностью до 100 наносекунд, так что только чётными тут секунды не будут.FAT32 в Linux разнится с FAT32 в Windows? Я бы не поручился, что некоторых особенностей реализации нет.Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 25, 2012, 17:40 Как видим для FAT время создания с точностью до 10 миллисекунд, время изменения с точностью до 2 секунд. Так что надо было автору сперва документацию глянуть, сразу же понял бы все =). Так откуда ж мне знать, что это особенность файловой системы? Буквально первый опыт написания программы на C++ и пользования IDE Qt Creator.Пользуясь случаем, позвольте совершенно нубский вопрос. Никак не получается сконвертить HEX строчку в число. Пуркуа? Код
В итоге ok = false и d = 0. Вразумите, а! Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 25, 2012, 17:42 Дело в том (если залезть в википедию ;) ), что в fat32 хранит время создания файла с точностью до 2 секунд, а ntfs - с точностью до 100 наносекунд, так что только чётными тут секунды не будут. Меня интересует время последнего изменения. Оно пишется с точностью до 2-х секунд. Думаю, это и есть источник чётности. Название: Re: FILETIME (Win) и Linux Отправлено: V1KT0P от Март 25, 2012, 18:00 Код
В итоге ok = false и d = 0. Вразумите, а! Код
Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 25, 2012, 18:08 toUInt Е***ческая сила! Всего дна буковка и всё работает! Благодарю! Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 29, 2012, 15:06 Люди добрые! Помогите разгадать ребус из той же области. Программа записывает в бинарный файл дату. Никак не могу догнать, каким алгоритмом она высчитывается. Вот примеры:
12.03.2012 = D1279611 13.03.2012 = D127D901 12.04.2012 = D14F6601 12.03.2013 = D307BB01 Название: Re: FILETIME (Win) и Linux Отправлено: Bepec от Март 29, 2012, 15:13 Вопрос конечно глупый(а мб наоборот очень умный)
Твоя программа? Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 29, 2012, 15:15 Вопрос конечно глупый(а мб наоборот очень умный) Твоя программа? Неа, не моя. Причём она win32, а я в linux пытаюсь сделать аналог. Название: Re: FILETIME (Win) и Linux Отправлено: Bepec от Март 29, 2012, 15:19 Спросить бы зачем тебе такая фигня?
А по теме - или формат ищи той проги, как она и что сохраняет, или анализируй сам ;) PS получится почти что хак. Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 29, 2012, 15:21 Собственно перед тем, как задать вопрос, я уже пару дней анализирую :( Может она использует DOS Filetime, который укладывается в 4 байта, но я не нашёл, каким макаром эти 4 байта назад раскладывать.
Название: Re: FILETIME (Win) и Linux Отправлено: LisandreL от Март 29, 2012, 15:25 Количество секунд с 1901-01-01 00:00:01.
Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 29, 2012, 15:29 12.03.2012 => unixtime => 1 331 510 400 42 года
D1279611 => 3 509 032 465 111 лет Хм, может и впрямь ... Название: Re: FILETIME (Win) и Linux Отправлено: Bepec от Март 29, 2012, 15:37 3509032465 сек
58483874,41 мин 974731,240 час 40613,80 день 1353,793 мес 112,81 год 2013-112,81 = 1900,19 год от Р.Х. :) Давно обсуждал ещё студентом эту дату ;) Спасибо Lisandrel что напомнили. Название: Re: FILETIME (Win) и Linux Отправлено: nachinaushij от Март 29, 2012, 16:10 Спасибо Lisandrel Адназначна! Сердечная благодарность. Теперь всё срослось. Количество секунд с 1901 по 1970 = 2177452799. Отнимаем его от того хитрого времени, которое сохранено в файле и получаем милое сердцу unixtime. Ура, товарищи!Небольшое дополнение. Вдруг кто озадачиться такой же проблемой, чтобы не подставлять грабли, расскажу. Сначала были выставлены в виджете QDateEdit такие настройки: время = 00:00:00 мин. время = 00:00:00 макс. время = 23:59:59 timeSpec = LocalTime Потом экспериментальным путём была выведена цифра 2177522047. Вот её то я и отнимаю, чтобы из количества секунд с 1901 года получить unixtime. Откуда я взял первую цифру (2177452799) уже не помню (http://smiles.kolobok.us/standart/scratch_one-s_head.gif) |