Работа с файлами на SD-карте, создание файла с атрибутами (датой и временем создания)

MakPol
Offline
Зарегистрирован: 03.04.2018

Добрейшего времени суток!

Подскажите пожалуйста, возможно не понимаю очевидного....

Есть Arduino UNO и часы реального времени, а также переходничок на SD-карту. Собираю данные и логирую в файл, но, мне надо создавать файл со временем создания, чтобы потом по человечески эти файлы обрабатывать. Сейчас в имени файла у меня дата и время, но это не удобно, надо бы еще и дату создания записать. Возможно ли это? в классе File что-то не допер как быть. 

 

Не решали такую задачку?

b707
Offline
Зарегистрирован: 26.05.2017

распишите задачу подробнее, непонятно это:

>>> Сейчас в имени файла у меня дата и время, но это не удобно, надо бы еще и дату создания записать.

чем отличается "дата и время"  от "даты создания"?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

у файла в FAT есть описатель, там имя, расширение, атрибуты и дата создания.  Счас он дату создания пишет текстом в имя-расширение, а хочет писать сразу в дескриптор. 

MakPol
Offline
Зарегистрирован: 03.04.2018

Огромное спасибо, так и есть, пишу file_20200604_1500.csv но это не удобно, т.к. приходится потом на компьютере проходить и атрибуты выставлять, а то все даты одинаковые, когда файлы с разными именами дико неудобно

b707
Offline
Зарегистрирован: 26.05.2017

MakPol пишет:

а то все даты одинаковые, когда файлы с разными именами дико неудобно

"Иван васильевич, когда вы говорите - такое впечатление что вы бредите" (с)

Так и не понял - когда имена разные это удобно или нет

 

MakPol
Offline
Зарегистрирован: 03.04.2018

Я думаю, если не понять о чем я - то про дескрипторы файла вряд ли ответ найдется. Не стоит утруждать себя и лучше идти "обсирать" другие топики.сообщения. Это не форум по изложению информации. Почему-то люди меня понимают, видимо экстрасенсы ;)

MakPol
Offline
Зарегистрирован: 03.04.2018

DetSimen пишет:

у файла в FAT есть описатель, там имя, расширение, атрибуты и дата создания.  Счас он дату создания пишет текстом в имя-расширение, а хочет писать сразу в дескриптор. 

 

Arduino может дату создания в этот "описатель" добавлять/извлекать?

b707
Offline
Зарегистрирован: 26.05.2017

прощу прощения за "ивана васильевича". но вы правда излагаете очень путано.

у вас при создании файла на карте атрибут "дата и время создания" должен записываться автоматически. Как он у вас получается одинаковым?

И насчет имен все равно не понимаю - то вы пишете что "все даты одинаковые " и приходится сортировать, а то вдруг "все имена разные" и это "дико неудобно"?

Я. конечно. слегка вас тролю - но вы все-таки учитесь излагать мысли связно. Судя по стилю письма вам не 20 лет уже

Komandir
Offline
Зарегистрирован: 18.08.2018

Что мешает отвести в файле 10-100 байт и сохранять там хоть черта лысого ?

MakPol
Offline
Зарегистрирован: 03.04.2018

b707 пишет:

прощу прощения за "ивана васильевича". но вы правда излагаете очень путано.

у вас при создании файла на карте атрибут "дата и время создания" должен записываться автоматически. Как он у вас получается одинаковым?

И насчет имен все равно не понимаю - то вы пишете что "все даты одинаковые " и приходится сортировать, а то вдруг "все имена разные" и это "дико неудобно"?

Я. конечно. слегка вас тролю - но вы все-таки учитесь излагать мысли связно. Судя по стилю письма вам не 20 лет уже

 

Ситуация следующая, пишу логи в разные файлы, взяв за основу стандартный пример DataLogger из ArduinoIDE. Например в один файл идет информация о вольтаже и называю я файл volt_YYYYMMDD_HHMMSS.csv, а в другой файл, в зависимости от условий идет информация о силе тока, а также прочие данные, снимаемые ардуинкой и называю файл amper_YYYYMMDD_HHMMSS.csv
где YYYYMMDD_HHMMSS это то, что я сниму с модуля часов (20200604_153000 например). И вот так работает эта моя ардуинка, пишет себе файлики при активации и вытаскиваю я карту, открываю а там все файлы с датой создания одинаковой, что-то типа 1900 год 1 месяц, первое число, что вполне закономерно, это же я не в операционке создавал файл, а при создании все что указывал это имя.
Так вот это и есть неудобно, т.к. найти самый свежий файл неудобно, в итоге обрабаьываю файлы уже в bash и только потом можно в этой "помойке" нормально ориентироваться сортируя в файловых менеджерах. 
Вот так вот как-то.

MakPol
Offline
Зарегистрирован: 03.04.2018

Komandir пишет:

Что мешает отвести в файле 10-100 байт и сохранять там хоть черта лысого ?

В теле файла записать что-то имеется в виду? Нафига? Мне надо задать дату и время создания файла, не только имя и расширение, но и дату и время создания. Зачем отводить в файле 10-100 байт и сохранять там что-то кроме данных?

Файл в формате csv, если в файле будет черт лысый кроме данных - дальнейшая обработка снятых показаний - псу под хвост

b707
Offline
Зарегистрирован: 26.05.2017

MakPol пишет:

называю я файл volt_YYYYMMDD_HHMMSS.csv, а в другой файл, в зависимости от условий идет информация о силе тока, а также прочие данные, снимаемые ардуинкой и называю файл amper_YYYYMMDD_HHMMSS.csv

Так вот это и есть неудобно, т.к. найти самый свежий файл неудобно, в итоге обрабаьываю файлы уже в bash

простите, а отсортировать по имени не пробовали? при таких именах у вас сначала будут лежать все файлы amper_ХХХХХХХ - строго по дате и времени создания.  Потом точно также все файлы volt_XXXXXX - опять же по времени создания.

Не понимаю вашей проблемы, честно.

Я в линуксе логи обзываю башем точно по такому принципу и сортирую потом по имени, а не по дате - хотя в линуксе с датой никаких пробем нет, как понимаете

Komandir
Offline
Зарегистрирован: 18.08.2018

Библиотеку надо посмотреть и глянуть что там к чему, и подправить под свои нужды.

b707
Offline
Зарегистрирован: 26.05.2017

MakPol пишет:

Файл в формате csv, если в файле будет черт лысый кроме данных - дальнейшая обработка снятых показаний - псу под хвост

вообще-то наоборот. Если в файл в каждой строчке писать так называемый timestamp - дату и время измерения - то даты из атрибутов и имен файлов вообще станут ненужным:

2020.05.31 14:36:44, 123, 456.67
2020.05.31 14:46:44, 13, 456.67
2020.05.31 14:56:44, 12, 46.67
2020.05.31 15:06:44, 123, 456.67

потом заливаете все эти файлы в БД вообще не сортируя - они по timestamp в начале строчки сами отсортируются

MakPol
Offline
Зарегистрирован: 03.04.2018

b707 пишет:

простите, а отсортировать по имени не пробовали? при таких именах у вас сначала будут лежать все файлы amper_ХХХХХХХ - строго по дате и времени создания.  Потом точно также все файлы volt_XXXXXX - опять же по времени создания.

Не понимаю вашей проблемы, честно.

Я в линуксе логи обзываю башем точно по такому принципу и сортирую потом по имени, а не по дате - хотя в линуксе с датой никаких пробем нет, как понимаете

ок, сортирую я по имени
пусть 2 файла создается
volt*

и

amper*
Получу в начале пачку amper, т.к. в начале "a"
затем пачку volt, т.к. в начале "v"
но гораздо удобнее не в имя файла писать дату, а в соответствующий атрибут, чтобы штатно все обрабатывать, вот для этого и решил узнать, реально или нет и если реально то как. Можно все в имя писать, зачем идиотры изобрели дату, время создания, а также атрибуты типа ro и прочее, все ведь можно писать в имя.... если так рассуждать

Вопрос простой - можно ли заставить arduino писать дату и время создания файла? Если можно то как?

То что мне это не надо и можно выкрутится костылями через имя файла - эт овсе уже сделано, но я для того и спрашиваю, чтобы дату писать в специально отведенное место, не захламляя имя файла, итак там символов не много в fat16. Но это уже совсем другая история...

b707
Offline
Зарегистрирован: 26.05.2017

MakPol пишет:

но гораздо удобнее не в имя файла писать дату, а в соответствующий атрибут, чтобы штатно все обрабатывать

"штатно" - это как? если вы башем владеете, написать любую сортировку файлов хоть по имени, хоть по атрибуту - вопрос десяти строчек в скрипте...

Цитата:
вот для этого и решил узнать, реально или нет и если реально то как.

вам Командир уже ответил - открываете библиотеку SD и смотрите, насколько полно она поддерживает FAT

Там могут быть три варианта  :

а) есть готовая функция установки атрибутов

б) библиотека работает с атрибутами, но пишет туда дефолтные значения, типа 1 января 1970 г

в) библиотека вообще не поддерживает атрибты

 

В варианте а) все очевидно, в  б) - придется дописать свою функцию для установки нужного атрибута. В варианте в). имхо, проще забить и пользоваться именем.

MakPol
Offline
Зарегистрирован: 03.04.2018

Понял, буду смотреть, а вариант забить, для меня не вопрос, так и делаю, а вот в случае с теми, кому приходится пользоваться моим логгером - боюсь слово bash говорить нельзя ))) Но csv самый свежий без проблем в провославной ОС найдут по дате создания и обработают в Excel :) Построят красивый граффик для еще больших дЭбилов, но это снова совсем другая история ))))))))

Komandir
Offline
Зарегистрирован: 18.08.2018

есть в SDfile callback для даты времени

MakPol
Offline
Зарегистрирован: 03.04.2018

Komandir пишет:

есть в SDfile callback для даты времени

Понял, попробую, большое спасибо!

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Уже ответили, дополню: у SDFat, например, есть 

SdFile::dateTimeCallback(setFileDateTime);

где функция-коллбэк может быть реализована примерно так:

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);
}

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Подпишусь, тоже интересно

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Совсем было собрался рассказать, как это делается, привести пример и изложить кое-какую полезную для этой задачи информацию о работе с SD, но есть одна беда:

MakPol пишет:

Это не форум по изложению информации. 

Поэтому, я воздержусь от того, чтобы её излагать.

Всего хорошего!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Совсем было собрался рассказать, как это делается, привести пример и изложить кое-какую полезную для этой задачи информацию о работе с SD, но есть одна беда:

MakPol пишет:

Это не форум по изложению информации. 

Поэтому, я воздержусь от того, чтобы её излагать.

Всего хорошего!

есть и другие заинтересованные в информации лица, так что излагайте, лички то тут нету )))

MakPol
Offline
Зарегистрирован: 03.04.2018

ЕвгенийП пишет:

Совсем было собрался рассказать, как это делается, привести пример и изложить кое-какую полезную для этой задачи информацию о работе с SD, но есть одна беда:

MakPol пишет:

Это не форум по изложению информации. 

Поэтому, я воздержусь от того, чтобы её излагать.

Всего хорошего!

И Вам не болеть. А выдрать из контекста надо было вообще только одно слово и тогда еще прикольнее было бы придраться. А то что в контексте мои процитированные слова означали "Это не форум по русскому языку и соревнование по изложениям" это видимо непонятно, но тогда не стоит в камеди клаб превращать, переиначивая все. Есть что сказать - буду благодарен, если надо подокапываться как описал - да, пожалуй не стоит.

Петросянов развелось...

MakPol
Offline
Зарегистрирован: 03.04.2018

ua6em пишет:

есть и другие заинтересованные в информации лица, так что излагайте, лички то тут нету )))

 

Там цель не изложить информацию была, а придраться. Кто хотел подсказать - подсказал. Пока не проверил в действии колбек-функцию, но направление понятно. На днях вернусь к вопросу и если что выйдет - код тут просто выложу, чтобы проще другим было.

Чечако
Offline
Зарегистрирован: 15.06.2018

MakPol пишет:

цель не изложить информацию была, а придраться. Кто хотел подсказать - подсказал. Пока не проверил в действии колбек-функцию, но направление понятно. На днях вернусь к вопросу и если что выйдет - код тут просто выложу, чтобы проще другим было.

Весь код Вам уже выложил уважаемый DIYMan. Куда еще проще-то?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Чечако пишет:

MakPol пишет:

цель не изложить информацию была, а придраться. Кто хотел подсказать - подсказал. Пока не проверил в действии колбек-функцию, но направление понятно. На днях вернусь к вопросу и если что выйдет - код тут просто выложу, чтобы проще другим было.

Весь код Вам уже выложил уважаемый DIYMan. Куда еще проще-то?

Тем более, что данный код взят из примеров к SDFat, моего там - только строчки с получением времени от DS3231, по сути. Проще, действительно, некуда, согласен.

Komandir
Offline
Зарегистрирован: 18.08.2018

Есть вариант и без 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");
  }
  ...
Чечако
Offline
Зарегистрирован: 15.06.2018

DIYMan пишет:

Тем более, что данный код взят из примеров к SDFat, моего там - только строчки с получением времени от DS3231, по сути. Проще, действительно, некуда, согласен.

Я в курсе, сам его использую для этих целей. :)