Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp43 [2024/12/01 11:25] – создано labuser30products:laboratory_iot_c:exp43 [2024/12/01 17:48] (текущий) – [Программный код эксперимента] labuser30
Строка 5: Строка 5:
 Файловая система связывает носитель информации с одной стороны и интерфейс для доступа к файлам — с другой. Когда прикладная программа обращается к файлу, она не имеет никакого представления о том, каким образом расположена информация на носителе, так же как и о том, на каком физическом типе носителя (CD, жёстком диске, магнитной ленте, блоке флеш-памяти или другом) он записан. Всё, что знает программа — это имя файла, его размер и атрибуты. Эти данные она получает от файловой системы. Именно файловая система устанавливает, где и как будет записан файл на физическом носителе (например, жёстком диске). Файловая система связывает носитель информации с одной стороны и интерфейс для доступа к файлам — с другой. Когда прикладная программа обращается к файлу, она не имеет никакого представления о том, каким образом расположена информация на носителе, так же как и о том, на каком физическом типе носителя (CD, жёстком диске, магнитной ленте, блоке флеш-памяти или другом) он записан. Всё, что знает программа — это имя файла, его размер и атрибуты. Эти данные она получает от файловой системы. Именно файловая система устанавливает, где и как будет записан файл на физическом носителе (например, жёстком диске).
  
-Мы уже знаем, что микроконтроллер, на базе которого построен наш конструктор имеет Flash-память с организованной на ней файловой системой. Человек может получить доступ к этой "флешке", например, через файловый менеджер среды программирования EsPy. Но наши программы тоже могут работать с файловой системой. Мы уже загружали библиотеки и даже создавали файл с данными с температурных датчиков. Но это не все возможности. Давайте познакомимся с файловой системой поближе.+Мы уже знаем, что микроконтроллер, на базе которого построен наш конструктор имеет Flash-память с организованной на ней файловой системой. Человек может получить доступ к этой "флешке", например, через файловый менеджер среды программирования EsPy. Но наши программы тоже могут работать с файловой системой. Мы уже загружали библиотеки и даже создавали файл с данными с температурных датчиков. Но это не все возможности. Давайте познакомимся с файловой системой поближе на примере следующей программы.
  
-Для работы с файловой системой необходимо подключить библиотеку: +==== Программный код эксперимента ==== 
-<code python+<file arduino Exp43.ino[enable_line_numbers="2", start_line_numbers_at="1"]
-import os +#include "LittleFS.h" 
-</code>+  
 +void listDir(String path, bool showPath) { 
 +  Serial.println(); 
 +  File dir = LittleFS.open(path, "r"); 
 +  File file = dir.openNextFile(); 
 +  while (dir) { 
 +    Serial.print("name: "); 
 +    if (showPath) Serial.print(file.fullName()); 
 +    else Serial.print(file.name()); 
  
-После этого можно работать с функциями файловой системыДля начала получим список файлов+    if (file.isDirectory()) Serial.print(", typefolder, ");  
-<file python Exp43-1.py[enable_line_numbers="2", start_line_numbers_at="1"]> +    else Serial.print(type: file, ");  
-import os+     
 +    Serial.print("size: "); 
 +    Serial.println(file.size()); 
 +     
 +    file = dir.openNextFile(); 
 +  } 
 +}
  
-files = os.listdir()+void setup() { 
 +  Serial.begin(9600); 
 +  Serial.println(); 
 +  
 +  LittleFS.format(); 
 +  LittleFS.begin();
  
-for file in files: +  File file = LittleFS.open("/test.txt", "w"); 
-    print(file) +  file.print("Some text"); 
-</file>+  file.close(); 
 +  listDir("/", false);
  
-Программы вывела в терминал список файловВ вашем случае вывод может отличаться. +  LittleFS.mkdir("/dir"); 
-<code> +  listDir("/", false);
-boot.py +
-init.mpy +
-lcd_api.py +
-esp8266_i2c_lcd.py +
-mfrc522.mpy +
-temp_data.csv +
-</code>+
  
-Мы видим список файловОднако нам может требоваться допонительная информациянапример размер файловДля этого есть функция ''ilistdir()'' +  file = LittleFS.open("/dir/test2.txt""w"); 
-<file python Exp43-2.py[enable_line_numbers="2", start_line_numbers_at="1"]> +  file.print("Some other text"); 
-import os+  file.close(); 
 +  listDir("/dir/", false); 
 +  listDir("/dir/", true);
  
-files = os.ilistdir() +  LittleFS.remove("/dir/test2.txt"); 
-for file in files: +  LittleFS.rmdir("/dir"); 
-    print(file+  listDir("/", false); 
-</file>+   
 +  LittleFS.rename("/test.txt", "/test_new.txt"); 
 +  listDir("/", false); 
 +}
  
-Программа выводит список файлов: Имя, тип (файл или директория), 0, размер файла в байтах +void loop() 
 +
 +</file> 
  
-<code> +Для работы с файловой системой необходимо подключить библиотеку: 
-('boot.py', 32768, 0, 252) +<code arduino[enable_line_numbers="2", start_line_numbers_at="1"]
-('init.mpy', 32768, 0, 225) +#include "LittleFS.h"
-('lcd_api.py', 32768, 0, 6882) +
-('esp8266_i2c_lcd.py', 32768, 0, 3293) +
-('mfrc522.mpy', 32768, 0, 2392) +
-('temp_data.csv', 32768, 0, 820)+
 </code> </code>
  
-Теперь давайте создадим директорию с именем dir: +Для вывода содержимого директории мы написали специальную функцию: 
-''os.mkdir('dir')''. Если такая директория уже есть, то получим сообщение об ошибке. Если все в порядке, то директория будет создана. Теперь повторим вывод функции ilistdir()+<code arduino[enable_line_numbers="2", start_line_numbers_at="3"]> 
 +void listDir(String path, bool showPath) { 
 +  Serial.println(); 
 +  File dir = LittleFS.open(path, "r"); 
 +  File file = dir.openNextFile(); 
 +  while (dir) { 
 +    Serial.print("name: "); 
 +    if (showPath) Serial.print(file.fullName()); 
 +    else Serial.print(file.name())
  
-<code> +    if (file.isDirectory()Serial.print("type: folder") 
-('boot.py', 32768, 0, 252) +    else Serial.print(" type: file") 
-('init.mpy'327680, 225+     
-('lcd_api.py'32768, 0, 6882+    Serial.print("size: "); 
-('esp8266_i2c_lcd.py', 32768, 0, 3293+    Serial.println(file.size()); 
-('mfrc522.mpy', 32768, 0, 2392+     
-('temp_data.csv', 32768, 0, 820+    file = dir.openNextFile(); 
-('dir', 16384, 0, 0)+  } 
 +}
 </code> </code>
 +Она принимает два аргумента: первый — путь к директории, содержимое которой нужно вывести, второй - определяет нужно ли при выводе названия файла указывать полный путь к нему.
  
-Как видно, директория dir создалась.+Создаем объект директории: 
 +<code arduino[enable_line_numbers="2", start_line_numbers_at="5"]> 
 +  File dir = LittleFS.open(path, "r"); 
 +</code>
  
-В файловых системах есть такое понятие как //путь//. Это последовательность вложенных директорий от корня файловой системы до какого-либо файла или директории. Давайте посмотрим путь до текущей директории+Открываем первый файл: 
-<file python Exp43-3.py[enable_line_numbers="2", start_line_numbers_at="1"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="6"]> 
-import os+  File file = root.openNextFile();  
 +</code>
  
-uos.getcwd() +Далее в цикле ''While'' сначала выводим в зависимости от аргумента showPath имя файла/директории с указанием пути или без:  
-</file>+<code arduino[enable_line_numbers="2", start_line_numbers_at="8"]> 
 +    Serial.print("name: ")
 +    if (showPath) Serial.print(file.fullName()); 
 +    else Serial.print(file.name());  
 +</code>
  
-Результат: +Определяем является ли объект директорией или файлом и печатаем соответствующий текст: 
-<code> +<code arduino[enable_line_numbers="2", start_line_numbers_at="12"]> 
-'/'+    if (file.isDirectory()) Serial.print(", type: folder, ");  
 +    else Serial.print(" type: file, "); 
 +</code>  
 + 
 +Выводим размер объекта (для директории он всегда равен 0): 
 +<code arduino[enable_line_numbers="2", start_line_numbers_at="15"]> 
 +    Serial.print("size: "); 
 +    Serial.println(file.size()); 
 +</code>  
 + 
 +В конце тела цикла открываем следующий файл в директории
 +<code arduino[enable_line_numbers="2", start_line_numbers_at="15"]
 +    file = dir.openNextFile(); 
 +</code>  
 + 
 +В следующих строках мы последовательно форматируем файловую систему и инициализируем ее. 
 +<code arduino[enable_line_numbers="2", start_line_numbers_at="26"]> 
 +  LittleFS.format(); 
 +  LittleFS.begin();
 </code> </code>
-Текущей директорией является / - это значит, что мы находимся в корне файловой системы. Давайте перейдем в недавно созданную нами директорию dir и повторно выведем текущую директорию 
  
-<file python Exp43-3.py[enable_line_numbers="2", start_line_numbers_at="1"]> +Создаем файл "test.txt", добавляем в него текст "Some text", закрываем файл и выводим содержимое корневой директории файловой системы:  
-import os+<code arduino[enable_line_numbers="2", start_line_numbers_at="29"]> 
 +  File file = LittleFS.open("/test.txt", "w"); 
 +  file.print("Some text"); 
 +  file.close(); 
 +  listDir("/", false); 
 +</code> 
  
-os.chdir('/dir'+Создаем в корневой директории директорию "dir" и снова выводим содержимое коневой директории:   
-uos.getcwd() +<code arduino[enable_line_numbers="2", start_line_numbers_at="34"]> 
-</file>+  LittleFS.mkdir("/dir"); 
 +  listDir("/", false); 
 +</code>
  
-Результат: +Создаем в директории "dir" файл "test2.txt", добавляем в него текст и закрываем. 
-<code> +Выводим содержимое директории "dir" сначала без отображения пути файла, после с отображением   
-'/dir'+<code arduino[enable_line_numbers="2", start_line_numbers_at="37"]
 +  file = LittleFS.open("/dir/test2.txt", "w"); 
 +  file.print("Some other text"); 
 +  file.close(); 
 +  listDir("/dir/", false); 
 +  listDir("/dir/", true);
 </code> </code>
-Это значит, что мы перешли в директорию /dir и сейчас она является текущей директорией. + 
-Если мы сейчас запросим список файлов, то получим пустой ответ так как в директории /dir у нас нет файлов. Мы можем получить список файлов в корне или в другой директории, если укажем конкретный путь, например+Удаляем сначала файл "test2.txt" в директории "dir", после саму директориюПосле выводим содержимое корневой папки:   
-<code python+<code arduino[enable_line_numbers="2", start_line_numbers_at="43"]
-files = os.listdir('/')+  LittleFS.remove("/dir/test2.txt"); 
 +  LittleFS.rmdir("/dir"); 
 +  listDir("/", false);
 </code> </code>
  
-Вернемся обратно в корень файловой системы и удалим директорию dir+Переименовываем файл "test.txt" в "test_new.txt" и выводим содержимое корневой директории   
-<file python Exp43-4.py[enable_line_numbers="2", start_line_numbers_at="1"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="47"]> 
-import os+  LittleFS.rename("/test.txt", "/test_new.txt"); 
 +  listDir("/", false); 
 +</code>
  
-os.chdir('/'+Ниже приведен полный вывод программы в последовательный порт: 
-os.rmdir('dir') +<code>
-</file>+
  
-Директорию нельзя удалить, если в ней есть вложенные файлы или директорииСначала нужно удалить их. Если все в порядке — директория удалится. Если сейчас запросить список файлов в корнето увидим, что директории dir больше нет.+name: test.txt type: filesize: 9
  
-Также мы можем удалить файл +name: dir, type: folder, size: 0 
-<code python> +name: test.txt type: file, size: 9 
-uos.remove('filename') + 
-</code>+name: test2.txt type: file, size: 15 
 + 
 +name: /dir/test2.txt type: file, size: 15 
 + 
 +name: test.txt type: file, size: 9
  
-или переименовать файл +name: test_new.txt type: filesize: 9
-<code python> +
-uos.rename('old_name''new_name')+
 </code> </code>
  
-<WRAP center round info 60%> +Так как программа выполняется очень быстро для того, чтобы увидеть вывод в последовательный необходимо открыть вкладку последовательного порта и нажать кнопку "Reset" на лаборатории. 
-[[https://docs.micropython.org/en/latest/library/uos.html|Подробная информация о работе с файловой системой]] +
-</WRAP>+