SD 08: Change directories
This example shows how to turn on the SD card. Move from one to another directory in order to manage files directly in each folder instead of using complete paths.
Required Materials
1 x Waspmote 1 x Battery 1 x SD card 1 x MiniUSB wire
Notes
- Remember that only 8.3 SHORT FILE NAME are valid for files and directories - Make sure Waspmote is switched off before inserting or removing the SD card. Otherwise, the SD card could be damaged. - Waspmote must not be switched off or reseted while there are ongoing read or write operations in the SD card. Otherwise, the SD card could be damaged and data could be lost. If you suspect that there may be some ongoing SD operations, wait a while until they are completed. - This example can be executed in Waspmote v12 and Waspmote v15
Code
/*
* ------ [SD_08] - Change current working directory --------
*
* Explanation: Turn on the SD card. Move from one to another directory
* in order to manage files directly in each folder instead of using
* complete paths.
*
* Copyright (C) 2016 Libelium Comunicaciones Distribuidas S.L.
* http://www.libelium.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
* Version: 3.0
* Design: David Gascón
* Implementation: Yuri Carmona
*/
// define folder and file names to be created: MUST be 8.3 SHORT FILE NAME
char path[]="/FOLD1/FOLD2/FOLD3";
char file1[]="FILE1";
char file2[]="FILE2";
char file3[]="FILE3";
uint8_t sd_answer;
void setup()
{
// open USB port
USB.ON();
USB.println(F("SD_08 example"));
// Set SD ON
SD.ON();
// delete all contained files in 'path'
sd_answer = SD.rmRfDir("/FOLD1");
if( sd_answer == true )
{
USB.println(F("Delete whole directory path"));
}
else
{
USB.println(F("Delete Error"));
}
// create path
sd_answer = SD.mkdir(path);
if( sd_answer == true )
{
USB.print(F("Created directory system:"));
USB.println(path);
}
else
{
USB.println(F("mkdir Error"));
}
}
void loop()
{
// Starting current working directory is Root directory
/////////////////////////////////////////////////////////
// 1. change directory to 'fold3'
/////////////////////////////////////////////////////////
if(SD.cd(path))
{
USB.println(F("\ninside /FOLD1/FOLD2/FOLD3:"));
}
else
{
USB.println("change to directory /FOLD1/FOLD2/FOLD3 FAILED");
}
/////////////////////////////////////////////////////////
// 2. create a file inside /fold1/fold2/fold3/
sd_answer = SD.create( file3 );
if( sd_answer == true )
{
USB.println(F("FILE3 created"));
}
else
{
USB.println(F("FILE3 not created"));
}
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
// 3. list current working directory: fold3
/////////////////////////////////////////////////////////
USB.println(F("-----------------------------"));
USB.println(F("\nlist /FOLD1/FOLD2/FOLD3 contents:"));
USB.println(F("-----------------------------"));
SD.ls( LS_SIZE | LS_DATE );
USB.println(F("-----------------------------"));
delay(2000);
/////////////////////////////////////////////////////////
// 4. Go one directory up to /fold1/fold2/
/////////////////////////////////////////////////////////
if(SD.cd(".."))
{
USB.println("\ninside /FOLD1/FOLD2:");
}
else
{
USB.println("change to directory /FOLD1/FOLD2 FAILED");
}
/////////////////////////////////////////////////////////
// 5. create a file inside /fold1/fold2/
/////////////////////////////////////////////////////////
sd_answer = SD.create(file2);
if( sd_answer == true )
{
USB.println(F("FILE2 created"));
}
else
{
USB.println(F("FILE2 not created"));
}
/////////////////////////////////////////////////////////
// 6. list current working directory: fold2
/////////////////////////////////////////////////////////
USB.println(F("\n-----------------------------"));
USB.println(F("list /FOLD1/FOLD2 contents:"));
USB.println(F("-----------------------------"));
SD.ls( LS_SIZE | LS_DATE );
USB.println(F("-----------------------------"));
delay(2000);
/////////////////////////////////////////////////////////
// 7 - go one directory up to /fold1/
/////////////////////////////////////////////////////////
sd_answer = SD.cd("..");
if( sd_answer == true )
{
USB.println("\ninside /FOLD1");
}
else
{
USB.println("change to directory /FOLD1 FAILED");
}
/////////////////////////////////////////////////////////
// 8. create a file inside /fold1/
/////////////////////////////////////////////////////////
sd_answer = SD.create(file1);
if( sd_answer == true )
{
USB.println(F("FILE1 created"));
}
else
{
USB.println(F("FILE1 not created"));
}
/////////////////////////////////////////////////////////
// 9. list current working directory: fold1
/////////////////////////////////////////////////////////
USB.println(F("\n-----------------------------"));
USB.println(F("list /FOLD1 contents:"));
USB.println(F("-----------------------------"));
SD.ls( LS_SIZE | LS_DATE );
USB.println(F("-----------------------------"));
delay(2000);
/////////////////////////////////////////////////////////
// 10. go one directory up to ROOT directory
/////////////////////////////////////////////////////////
sd_answer = SD.cd("..");
if( sd_answer == true )
{
USB.println("\ninside ROOT directory:");
}
else
{
USB.println("change to ROOT directory FAILED");
}
/////////////////////////////////////////////////////////
// 11. list Root directory
/////////////////////////////////////////////////////////
USB.println(F("###############################"));
SD.ls( LS_R | LS_SIZE | LS_DATE );
USB.println(F("###############################"));
delay(10000);
}
Output
H#
SD_08 example
Delete whole directory path
Created directory system:/FOLD1/FOLD2/FOLD3
inside /FOLD1/FOLD2/FOLD3:
FILE3 created
-----------------------------
list /FOLD1/FOLD2/FOLD3 contents:
-----------------------------
FILE3 2014-06-02 18:46:22 0
-----------------------------
inside /FOLD1/FOLD2:
FILE2 created
-----------------------------
list /FOLD1/FOLD2 contents:
-----------------------------
FOLD3/ 2014-06-02 18:46:22
FILE2 2014-06-02 18:46:26 0
-----------------------------
inside /FOLD1
FILE1 created
-----------------------------
list /FOLD1 contents:
-----------------------------
FOLD2/ 2014-06-02 18:46:22
FILE1 2014-06-02 18:46:28 0
-----------------------------
inside ROOT directory:
###############################
ACC_FILE.TXT 2013-06-19 14:12:34 25591
PWR1.TXT 2010-10-06 14:00:54 926
INT_FILE.TXT 2010-02-08 14:10:56 585
FILE1.TXT 2014-06-02 18:32:38 0
FILE2.TXT 2014-06-02 18:35:36 5
FILE3.TXT 2014-06-02 18:38:10 52
FILE4.TXT 2014-06-02 18:39:32 279
FOLDER1/ 2014-06-02 18:44:36
FOLDER2/ 2014-06-02 18:44:36
FOLDER3/ 2014-06-02 18:44:36
FILE3 2014-06-02 18:44:38 0
LOG 2014-06-02 18:45:16 2454
FILE2 2014-06-02 18:44:38 0
FILE1 2014-06-02 18:44:36 0
FOLD1/ 2014-06-02 18:46:22
FOLD2/ 2014-06-02 18:46:22
FOLD3/ 2014-06-02 18:46:22
FILE3 2014-06-02 18:46:22 0
FILE2 2014-06-02 18:46:26 0
FILE1 2014-06-02 18:46:28 0
FILE.TXT 2010-10-06 19:35:12 2300
FILEYURI.TXT 2010-02-08 14:48:02 2300
DEVICES.TXT 2012-07-17 17:41:20 211
FILETEST.TXT 2010-10-06 19:38:22 253
BT_FILE.TXT 2010-11-23 12:00:56 222
DATA/ 2012-07-17 19:09:50
FILE3 2014-06-02 18:44:38 0
LOG 2014-06-02 18:45:16 2454
FILE9.TXT 2012-07-17 19:27:08 185
###############################
Last updated