/** Change a volume's working directory * * Changes the volume working directory to the \a path subdirectory. * Optionally set the current working directory to the volume's * working directory. * * Example: If the volume's working directory is "/DIR", chdir("SUB") * will change the volume's working directory from "/DIR" to "/DIR/SUB". * * If path is "/", the volume's working directory will be changed to the * root directory * * \param[in] path The name of the subdirectory. * * \param[in] set_cwd Set the current working directory to this volume's * working directory if true. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ bool SdFat::chdir(const char *path, bool set_cwd) { SdBaseFile dir; if (path[0] == '/' && path[1] == '\0') return chdir(set_cwd); if (!dir.open(&m_vwd, path, O_READ)) goto fail; if (!dir.isDir()) goto fail; m_vwd = dir; if (set_cwd) SdBaseFile::setCwd(&m_vwd); return true; fail: return false; }
void CardReader::chdir(const char* relpath) { SdBaseFile newfile; SdBaseFile* parent = &root; if (workDir.isOpen()) parent = &workDir; if (!newfile.open(parent, relpath, O_READ)) { ECHO_LMT(DB, SERIAL_SD_CANT_ENTER_SUBDIR, relpath); } else { if (workDirDepth < SD_MAX_FOLDER_DEPTH) { ++workDirDepth; for (int d = workDirDepth; d--;) workDirParents[d + 1] = workDirParents[d]; workDirParents[0] = *parent; } workDir = newfile; } }
void SDCard::JSONFileInfo(const char* filename) { SdBaseFile targetFile; GCodeFileInfo *info,tmpInfo; if (strlen(filename) == 0) { targetFile = file; info = &fileInfo; } else { if (!targetFile.open(fat.vwd(), filename, O_READ) || targetFile.isDir()) { Com::printF(Com::tJSONErrorStart); Com::printF(Com::tFileOpenFailed); Com::printFLN(Com::tJSONErrorEnd); return; } info = &tmpInfo; info->init(targetFile); } if (!targetFile.isOpen()) { Com::printF(Com::tJSONErrorStart); Com::printF(Com::tNotSDPrinting); Com::printFLN(Com::tJSONErrorEnd); return; } // {"err":0,"size":457574,"height":4.00,"layerHeight":0.25,"filament":[6556.3],"generatedBy":"Slic3r 1.1.7 on 2014-11-09 at 17:11:32"} Com::printF(Com::tJSONFileInfoStart); Com::print(info->fileSize); Com::printF(Com::tJSONFileInfoHeight); Com::print(info->objectHeight); Com::printF(Com::tJSONFileInfoLayerHeight); Com::print(info->layerHeight); Com::printF(Com::tJSONFileInfoFilament); Com::print(info->filamentNeeded); Com::printF(Com::tJSONFileInfoGeneratedBy); Com::print(info->generatedBy); Com::print('"'); if (strlen(filename) == 0) { Com::printF(Com::tJSONFileInfoName); file.printName(); Com::print('"'); } Com::print('}'); Com::println(); };
void SDCard::lsJSON(const char *filename) { SdBaseFile dir; fat.chdir(); if (*filename == 0) { dir.openRoot(fat.vol()); } else { if (!dir.open(fat.vwd(), filename, O_READ) || !dir.isDir()) { Com::printF(Com::tJSONErrorStart); Com::printF(Com::tFileOpenFailed); Com::printFLN(Com::tJSONErrorEnd); return; } } Com::printF(Com::tJSONDir); SDCard::printEscapeChars(filename); Com::printF(Com::tJSONFiles); dir.lsJSON(); Com::printFLN(Com::tJSONArrayEnd); }
/** Truncate a file to a specified length. The current file position * will be maintained if it is less than or equal to \a length otherwise * it will be set to end of file. * * \param[in] path A path with a valid 8.3 DOS name for the file. * \param[in] length The desired length for the file. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. * Reasons for failure include file is read only, file is a directory, * \a length is greater than the current file size or an I/O error occurs. */ bool SdFat::truncate(const char* path, uint32_t length) { SdBaseFile file; if (!file.open(path, O_WRITE)) return false; return file.truncate(length); }
/** Remove a subdirectory from the volume's working directory. * * \param[in] path A path with a valid 8.3 DOS name for the subdirectory. * * The subdirectory file will be removed only if it is empty. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ bool SdFat::rmdir(const char* path) { SdBaseFile sub; if (!sub.open(path, O_READ)) return false; return sub.rmdir(); }
/** Rename a file or subdirectory. * * \param[in] oldPath Path name to the file or subdirectory to be renamed. * * \param[in] newPath New path name of the file or subdirectory. * * The \a newPath object must not exist before the rename call. * * The file to be renamed must not be open. The directory entry may be * moved and file system corruption could occur if the file is accessed by * a file object that was opened before the rename() call. * * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ bool SdFat::rename(const char *oldPath, const char *newPath) { SdBaseFile file; if (!file.open(oldPath, O_READ)) return false; return file.rename(&m_vwd, newPath); }