Работа с файлами на SD-карте, создание файла с атрибутами (датой и временем создания)
- Войдите на сайт для отправки комментариев
Чт, 04/06/2020 - 15:28
Добрейшего времени суток!
Подскажите пожалуйста, возможно не понимаю очевидного....
Есть Arduino UNO и часы реального времени, а также переходничок на SD-карту. Собираю данные и логирую в файл, но, мне надо создавать файл со временем создания, чтобы потом по человечески эти файлы обрабатывать. Сейчас в имени файла у меня дата и время, но это не удобно, надо бы еще и дату создания записать. Возможно ли это? в классе File что-то не допер как быть.
Не решали такую задачку?
распишите задачу подробнее, непонятно это:
>>> Сейчас в имени файла у меня дата и время, но это не удобно, надо бы еще и дату создания записать.
чем отличается "дата и время" от "даты создания"?
у файла в FAT есть описатель, там имя, расширение, атрибуты и дата создания. Счас он дату создания пишет текстом в имя-расширение, а хочет писать сразу в дескриптор.
Огромное спасибо, так и есть, пишу file_20200604_1500.csv но это не удобно, т.к. приходится потом на компьютере проходить и атрибуты выставлять, а то все даты одинаковые, когда файлы с разными именами дико неудобно
а то все даты одинаковые, когда файлы с разными именами дико неудобно
"Иван васильевич, когда вы говорите - такое впечатление что вы бредите" (с)
Так и не понял - когда имена разные это удобно или нет
Я думаю, если не понять о чем я - то про дескрипторы файла вряд ли ответ найдется. Не стоит утруждать себя и лучше идти "обсирать" другие топики.сообщения. Это не форум по изложению информации. Почему-то люди меня понимают, видимо экстрасенсы ;)
у файла в FAT есть описатель, там имя, расширение, атрибуты и дата создания. Счас он дату создания пишет текстом в имя-расширение, а хочет писать сразу в дескриптор.
Arduino может дату создания в этот "описатель" добавлять/извлекать?
прощу прощения за "ивана васильевича". но вы правда излагаете очень путано.
у вас при создании файла на карте атрибут "дата и время создания" должен записываться автоматически. Как он у вас получается одинаковым?
И насчет имен все равно не понимаю - то вы пишете что "все даты одинаковые " и приходится сортировать, а то вдруг "все имена разные" и это "дико неудобно"?
Я. конечно. слегка вас тролю - но вы все-таки учитесь излагать мысли связно. Судя по стилю письма вам не 20 лет уже
Что мешает отвести в файле 10-100 байт и сохранять там хоть черта лысого ?
прощу прощения за "ивана васильевича". но вы правда излагаете очень путано.
у вас при создании файла на карте атрибут "дата и время создания" должен записываться автоматически. Как он у вас получается одинаковым?
И насчет имен все равно не понимаю - то вы пишете что "все даты одинаковые " и приходится сортировать, а то вдруг "все имена разные" и это "дико неудобно"?
Я. конечно. слегка вас тролю - но вы все-таки учитесь излагать мысли связно. Судя по стилю письма вам не 20 лет уже
Ситуация следующая, пишу логи в разные файлы, взяв за основу стандартный пример DataLogger из ArduinoIDE. Например в один файл идет информация о вольтаже и называю я файл volt_YYYYMMDD_HHMMSS.csv, а в другой файл, в зависимости от условий идет информация о силе тока, а также прочие данные, снимаемые ардуинкой и называю файл amper_YYYYMMDD_HHMMSS.csv
где YYYYMMDD_HHMMSS это то, что я сниму с модуля часов (20200604_153000 например). И вот так работает эта моя ардуинка, пишет себе файлики при активации и вытаскиваю я карту, открываю а там все файлы с датой создания одинаковой, что-то типа 1900 год 1 месяц, первое число, что вполне закономерно, это же я не в операционке создавал файл, а при создании все что указывал это имя.
Так вот это и есть неудобно, т.к. найти самый свежий файл неудобно, в итоге обрабаьываю файлы уже в bash и только потом можно в этой "помойке" нормально ориентироваться сортируя в файловых менеджерах.
Вот так вот как-то.
Что мешает отвести в файле 10-100 байт и сохранять там хоть черта лысого ?
В теле файла записать что-то имеется в виду? Нафига? Мне надо задать дату и время создания файла, не только имя и расширение, но и дату и время создания. Зачем отводить в файле 10-100 байт и сохранять там что-то кроме данных?
Файл в формате csv, если в файле будет черт лысый кроме данных - дальнейшая обработка снятых показаний - псу под хвост
называю я файл volt_YYYYMMDD_HHMMSS.csv, а в другой файл, в зависимости от условий идет информация о силе тока, а также прочие данные, снимаемые ардуинкой и называю файл amper_YYYYMMDD_HHMMSS.csv
Так вот это и есть неудобно, т.к. найти самый свежий файл неудобно, в итоге обрабаьываю файлы уже в bash
простите, а отсортировать по имени не пробовали? при таких именах у вас сначала будут лежать все файлы amper_ХХХХХХХ - строго по дате и времени создания. Потом точно также все файлы volt_XXXXXX - опять же по времени создания.
Не понимаю вашей проблемы, честно.
Я в линуксе логи обзываю башем точно по такому принципу и сортирую потом по имени, а не по дате - хотя в линуксе с датой никаких пробем нет, как понимаете
Библиотеку надо посмотреть и глянуть что там к чему, и подправить под свои нужды.
Файл в формате csv, если в файле будет черт лысый кроме данных - дальнейшая обработка снятых показаний - псу под хвост
вообще-то наоборот. Если в файл в каждой строчке писать так называемый timestamp - дату и время измерения - то даты из атрибутов и имен файлов вообще станут ненужным:
потом заливаете все эти файлы в БД вообще не сортируя - они по timestamp в начале строчки сами отсортируются
простите, а отсортировать по имени не пробовали? при таких именах у вас сначала будут лежать все файлы amper_ХХХХХХХ - строго по дате и времени создания. Потом точно также все файлы volt_XXXXXX - опять же по времени создания.
Не понимаю вашей проблемы, честно.
Я в линуксе логи обзываю башем точно по такому принципу и сортирую потом по имени, а не по дате - хотя в линуксе с датой никаких пробем нет, как понимаете
ок, сортирую я по имени
пусть 2 файла создается
volt*
и
amper*
Получу в начале пачку amper, т.к. в начале "a"
затем пачку volt, т.к. в начале "v"
но гораздо удобнее не в имя файла писать дату, а в соответствующий атрибут, чтобы штатно все обрабатывать, вот для этого и решил узнать, реально или нет и если реально то как. Можно все в имя писать, зачем идиотры изобрели дату, время создания, а также атрибуты типа ro и прочее, все ведь можно писать в имя.... если так рассуждать
Вопрос простой - можно ли заставить arduino писать дату и время создания файла? Если можно то как?
То что мне это не надо и можно выкрутится костылями через имя файла - эт овсе уже сделано, но я для того и спрашиваю, чтобы дату писать в специально отведенное место, не захламляя имя файла, итак там символов не много в fat16. Но это уже совсем другая история...
но гораздо удобнее не в имя файла писать дату, а в соответствующий атрибут, чтобы штатно все обрабатывать
"штатно" - это как? если вы башем владеете, написать любую сортировку файлов хоть по имени, хоть по атрибуту - вопрос десяти строчек в скрипте...
вам Командир уже ответил - открываете библиотеку SD и смотрите, насколько полно она поддерживает FAT
Там могут быть три варианта :
а) есть готовая функция установки атрибутов
б) библиотека работает с атрибутами, но пишет туда дефолтные значения, типа 1 января 1970 г
в) библиотека вообще не поддерживает атрибты
В варианте а) все очевидно, в б) - придется дописать свою функцию для установки нужного атрибута. В варианте в). имхо, проще забить и пользоваться именем.
Понял, буду смотреть, а вариант забить, для меня не вопрос, так и делаю, а вот в случае с теми, кому приходится пользоваться моим логгером - боюсь слово bash говорить нельзя ))) Но csv самый свежий без проблем в провославной ОС найдут по дате создания и обработают в Excel :) Построят красивый граффик для еще больших дЭбилов, но это снова совсем другая история ))))))))
есть в SDfile callback для даты времени
есть в SDfile callback для даты времени
Понял, попробую, большое спасибо!
Уже ответили, дополню: у SDFat, например, есть
где функция-коллбэк может быть реализована примерно так:
void setFileDateTime(uint16_t* date, uint16_t* time) { DS3231Time tm = RealtimeClock.getTime(); // return date using FAT_DATE macro to format fields *date = FAT_DATE(tm.year, tm. month, tm. dayOfMonth); // return time using FAT_TIME macro to format fields *time = FAT_TIME(tm.hour, tm. minute, tm. second); }Подпишусь, тоже интересно
Совсем было собрался рассказать, как это делается, привести пример и изложить кое-какую полезную для этой задачи информацию о работе с SD, но есть одна беда:
Это не форум по изложению информации.
Поэтому, я воздержусь от того, чтобы её излагать.
Всего хорошего!
Совсем было собрался рассказать, как это делается, привести пример и изложить кое-какую полезную для этой задачи информацию о работе с SD, но есть одна беда:
Это не форум по изложению информации.
Поэтому, я воздержусь от того, чтобы её излагать.
Всего хорошего!
есть и другие заинтересованные в информации лица, так что излагайте, лички то тут нету )))
Совсем было собрался рассказать, как это делается, привести пример и изложить кое-какую полезную для этой задачи информацию о работе с SD, но есть одна беда:
Это не форум по изложению информации.
Поэтому, я воздержусь от того, чтобы её излагать.
Всего хорошего!
И Вам не болеть. А выдрать из контекста надо было вообще только одно слово и тогда еще прикольнее было бы придраться. А то что в контексте мои процитированные слова означали "Это не форум по русскому языку и соревнование по изложениям" это видимо непонятно, но тогда не стоит в камеди клаб превращать, переиначивая все. Есть что сказать - буду благодарен, если надо подокапываться как описал - да, пожалуй не стоит.
Петросянов развелось...
есть и другие заинтересованные в информации лица, так что излагайте, лички то тут нету )))
Там цель не изложить информацию была, а придраться. Кто хотел подсказать - подсказал. Пока не проверил в действии колбек-функцию, но направление понятно. На днях вернусь к вопросу и если что выйдет - код тут просто выложу, чтобы проще другим было.
цель не изложить информацию была, а придраться. Кто хотел подсказать - подсказал. Пока не проверил в действии колбек-функцию, но направление понятно. На днях вернусь к вопросу и если что выйдет - код тут просто выложу, чтобы проще другим было.
Весь код Вам уже выложил уважаемый DIYMan. Куда еще проще-то?
цель не изложить информацию была, а придраться. Кто хотел подсказать - подсказал. Пока не проверил в действии колбек-функцию, но направление понятно. На днях вернусь к вопросу и если что выйдет - код тут просто выложу, чтобы проще другим было.
Весь код Вам уже выложил уважаемый DIYMan. Куда еще проще-то?
Тем более, что данный код взят из примеров к SDFat, моего там - только строчки с получением времени от DS3231, по сути. Проще, действительно, некуда, согласен.
Есть вариант и без callback:
... // create a new file with default timestamps if (!file.open("stamp.txt", O_WRONLY | O_CREAT)) { error("open stamp.txt failed"); } // set creation date time if (!file.timestamp(T_CREATE, 2014, 11, 10, 1, 2, 3)) { error("set create time failed"); } // set write/modification date time if (!file.timestamp(T_WRITE, 2014, 11, 11, 4, 5, 6)) { error("set write time failed"); } // set access date if (!file.timestamp(T_ACCESS, 2014, 11, 12, 7, 8, 9)) { error("set access time failed"); } ...Тем более, что данный код взят из примеров к SDFat, моего там - только строчки с получением времени от DS3231, по сути. Проще, действительно, некуда, согласен.
Я в курсе, сам его использую для этих целей. :)