diff --git a/libraries/SD/File.cpp b/libraries/SD/File.cpp index e12b81bc1..d6fb6417f 100644 --- a/libraries/SD/File.cpp +++ b/libraries/SD/File.cpp @@ -55,6 +55,10 @@ boolean File::seek(uint32_t pos) { return SD.file.seekSet(pos); } +uint32_t File::position() { + return SD.file.curPosition(); +} + uint32_t File::size() { return SD.file.fileSize(); } diff --git a/libraries/SD/SD.cpp b/libraries/SD/SD.cpp index 356a2986a..1d796e9ec 100644 --- a/libraries/SD/SD.cpp +++ b/libraries/SD/SD.cpp @@ -297,6 +297,9 @@ boolean callback_openPath(SdFile& parentDir, char *filePathComponent, if (isLastComponent) { SDClass *p_SD = static_cast(object); p_SD->file.open(parentDir, filePathComponent, p_SD->fileOpenMode); + if (p_SD->fileOpenMode == FILE_WRITE) { + p_SD->file.seekSet(p_SD->file.fileSize()); + } p_SD->c = -1; // TODO: Return file open result? return false; diff --git a/libraries/SD/SD.h b/libraries/SD/SD.h index bda862d54..ac8135574 100644 --- a/libraries/SD/SD.h +++ b/libraries/SD/SD.h @@ -21,8 +21,7 @@ #include #define FILE_READ O_READ -#define FILE_TRUNCATE (O_WRITE | O_CREAT | O_TRUNC) -#define FILE_APPEND (O_WRITE | O_CREAT | O_APPEND) +#define FILE_WRITE (O_READ | O_WRITE | O_CREAT | O_SYNC) class File : public Stream { public: @@ -34,6 +33,7 @@ public: virtual int available(); virtual void flush(); boolean seek(uint32_t pos); + uint32_t position(); uint32_t size(); void close(); operator bool(); diff --git a/libraries/SD/examples/Datalogger/Datalogger.pde b/libraries/SD/examples/Datalogger/Datalogger.pde index fd946163f..73d81af7b 100644 --- a/libraries/SD/examples/Datalogger/Datalogger.pde +++ b/libraries/SD/examples/Datalogger/Datalogger.pde @@ -59,8 +59,9 @@ void loop() } } - // open the file: - File dataFile = SD.open("datalog.txt", FILE_APPEND); + // open the file. note that only one file can be open at a time, + // so you have to close this one before opening another. + File dataFile = SD.open("datalog.txt", FILE_WRITE); // if the file is available, write to it: if (dataFile) { diff --git a/libraries/SD/examples/Files/Files.pde b/libraries/SD/examples/Files/Files.pde index 5b6791f6b..5ed9fea4e 100644 --- a/libraries/SD/examples/Files/Files.pde +++ b/libraries/SD/examples/Files/Files.pde @@ -46,7 +46,7 @@ void setup() // open a new file and immediately close it: Serial.println("Creating example.txt..."); - myFile = SD.open("example.txt", FILE_TRUNCATE); + myFile = SD.open("example.txt", FILE_WRITE); myFile.close(); // Check to see if the file exists: diff --git a/libraries/SD/examples/ReadWrite/ReadWrite.pde b/libraries/SD/examples/ReadWrite/ReadWrite.pde index 668fb0b6b..09b6bcd50 100644 --- a/libraries/SD/examples/ReadWrite/ReadWrite.pde +++ b/libraries/SD/examples/ReadWrite/ReadWrite.pde @@ -39,7 +39,7 @@ void setup() Serial.println("initialization done."); // open a file: - myFile = SD.open("test.txt", FILE_TRUNCATE); + myFile = SD.open("test.txt", FILE_WRITE); // if the file opened okay, write to it: if (myFile) { diff --git a/libraries/SD/keywords.txt b/libraries/SD/keywords.txt index 232466ad0..419fe04d5 100644 --- a/libraries/SD/keywords.txt +++ b/libraries/SD/keywords.txt @@ -19,11 +19,12 @@ remove KEYWORD2 rmdir KEYWORD2 open KEYWORD2 close KEYWORD2 - +seek KEYWORD2 +position KEYWORD2 +size KEYWORD2 ####################################### # Constants (LITERAL1) ####################################### FILE_READ LITERAL1 -FILE_TRUNCATE LITERAL1 -FILE_APPEND LITERAL1 +FILE_WRITE LITERAL1