SD и папка "System Volume Information"

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

SD и папка "System Volume Information"

Сообщение serg_svd »

Предыстория...
Решил я тут попробовать поработать с файлами на карте SD посредством библиотек и среды разработки Arduino. Для начала просто хотел посчитать количество папок и файлов на карте SD, потом уже посчитать количество файлов с разными расширениями.
И тут мне вес поломала скрытая папка "System Volume Information"!!! Дело в том, что она включается в количество папок, а находящийся внутри файлы - в общее число подсчитываемых файлов.

Теперь вопрос. Как пропустить эту папку из подсчета. Да и вообще в дальнейшем игнорировать ее на карте памяти? Я долго мучал поисковик, но, похоже, неправильно задаю ему вопрос. В общем решения пока не нашел.

В общем виде, согласно примерам из библиотеки SD, подсчет файлов и папок выглядит так:
Спойлер

Код: Выделить всё

void scanSD(File dir) {  
  while (true) {
    File entry =  dir.openNextFile();
    if (!entry) {
      // no more files
      break;
    }            
    if (entry.isDirectory()) {
        dirCnt++; // считаем количество папок
        scanSD(entry);
      }
    } else {
        fileCnt++;  // считаем количество файлов     
    }
    entry.close();
  }
}
Если подсчитывать, к примеру, файлы с расширением *.txt, то код выглядит так
Спойлер

Код: Выделить всё

void scanSD(File dir) {  
  while (true) {
    File entry =  dir.openNextFile();
    if (!entry) {
      // no more files
      break;
    }            
    if (entry.isDirectory()) {
        dirCnt++; // считаем количество папок
        scanSD(entry);
      }
    } else {
      fileName = entry.name();
      if (fileName.indexOf(".txt")) {
        fileCnt++;    // считаем количество файлов с расширением   
      }   
    }
    entry.close();
  }
}
Причем файлы внутри папки System Volume Information не имеют расширения, но при запуске последнего куска кода все равно включаются в подсчет числа файлов.
Аватара пользователя
vlasovzloy
Друг Кота
Сообщения: 20067
Зарегистрирован: Чт янв 26, 2012 16:44:29
Откуда: Таксимо

Re: SD и папка "System Volume Information"

Сообщение vlasovzloy »

А скрыть, как у всех устройств читает же атрибуты
Мои поставщики запчастей с отличной репутацией
texnomag.ru
radioremont.com
pl-1.org
4ip.info
elitan.ru
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

Re: SD и папка "System Volume Information"

Сообщение serg_svd »

Так папка и так скрытая, но приведенные выше функции все равно её включают в общую сумму

Так! С одним пунктом разобрался. Строчку кода

Код: Выделить всё

if (fileName.indexOf(".txt")) {}
надо записывать так

Код: Выделить всё

if (fileName.indexOf(".txt")>0) {}
Тогда подсчет файлов по расширению идет верно

Добавлено after 1 hour 12 minutes 46 seconds:
Вроде сделал, но на мой взгляд вариант с вычитанием из количества папок какой-то хромой...
Жду критики!
Спойлер

Код: Выделить всё

void scanSD(File dir) {  
  while (true) {
    File entry =  dir.openNextFile();
    if (!entry) {
      // no more files
      break;
    }            
    if (entry.isDirectory()) {
      dirName = entry.name();   
      if (dirName.indexOf("SYSTEM~1") == 0) {
        dirCnt--;
      }
      dirCnt++;
      scanSD(entry);
    } else {
      fileName = entry.name();
      if (fileName.indexOf(".txt") > 0) {
        fileCnt++;       
      }
    }
    entry.close();
  }
}
john1770
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт ноя 15, 2016 12:48:20

Re: SD и папка "System Volume Information"

Сообщение john1770 »

(fnfo.fattrib & AM_DIR) != 0) это указатель на папку
а это #define AM_HID 0x02 // Hidden скрытый файл
скомпоновать условие и вуаля
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

Re: SD и папка "System Volume Information"

Сообщение serg_svd »

[uquote="john1770",url="/forum/viewtopic.php?p=4620092#p4620092"](fnfo.fattrib & AM_DIR) != 0) это указатель на папку
а это #define AM_HID 0x02 // Hidden скрытый файл
скомпоновать условие и вуаля[/uquote]
Я не нашел в библиотеке SD данных указателей. Начал читать информацию в сети что-то запутался. Есть библиотека SD, а ест SDfat/ Какую посоветуете использовать и по какой причине??? Я вычитал такое мнение, что SDfat быстрее работает и лучше применять ее вместо "устаревшей" библиотеки SD. Только вот в чем она устарела мне тоже непонятно.
Опять же! Библиотека Sdfat есть авторская, а есть SdFat - Adafruit Fork
74LS00
Друг Кота
Сообщения: 7656
Зарегистрирован: Вс июл 24, 2011 11:38:09
Контактная информация:

Re: SD и папка "System Volume Information"

Сообщение 74LS00 »

Нафига она вообще на карте ? Удалить её нафиг, не может же винда быть установлена на медленную флешку.
john1770
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт ноя 15, 2016 12:48:20

Re: SD и папка "System Volume Information"

Сообщение john1770 »

Имелась ввиду библиотека fatfs от Чана
Но аттрибуты файлов должны быть во всех библиотеках
Аватара пользователя
serg_svd
Собутыльник Кота
Сообщения: 2560
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

Re: SD и папка "System Volume Information"

Сообщение serg_svd »

[uquote="74LS00",url="/forum/viewtopic.php?p=4622373#p4622373"]Нафига она вообще на карте ? Удалить её нафиг, не может же винда быть установлена на медленную флешку.[/uquote]
А если пользователь не знает, как удалять эту папку? Она же по умолчанию создается каждый раз, когда карта памяти подключена к компьютеру. Это фигня по дефолту стоит в системе. Поэтому и надо написать прошивку так, чтобы эта папка игнорировалась.
PS. Хотя сейчас пришла мысль, а нельзя ли средствами библиотеки SD удалять эту папку автоматом? пусть компьютер создаёт ее, а при работе с микроконтроллером будет удаляться. Проблему вижу только в том, что папка защищена

Я тут глянул описание библиотеки еще раз, а там сказано, что удаляет только пустую папку :facepalm:
john1770
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт ноя 15, 2016 12:48:20

Re: SD и папка "System Volume Information"

Сообщение john1770 »

Библиотека SdFat файл FsStructs.h
const uint8_t FS_ATTRIB_HIDDEN = 0x02;
const uint8_t FS_ATTRIB_DIRECTORY = 0x10;
Ответить

Вернуться в «Arduino»