CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Common/File/VFS/DirectoryReader.cpp
Views: 1401
#include <cstdio>12#include "Common/Common.h"3#include "Common/Log.h"4#include "Common/File/VFS/DirectoryReader.h"56DirectoryReader::DirectoryReader(const Path &path) {7path_ = path;8}910uint8_t *DirectoryReader::ReadFile(const char *path, size_t *size) {11Path new_path = Path(path).StartsWith(path_) ? Path(path) : path_ / path;12return File::ReadLocalFile(new_path, size);13}1415bool DirectoryReader::GetFileListing(const char *path, std::vector<File::FileInfo> *listing, const char *filter = nullptr) {16Path new_path = Path(path).StartsWith(path_) ? Path(path) : path_ / path;1718File::FileInfo info;19if (!File::GetFileInfo(new_path, &info))20return false;2122if (info.isDirectory) {23File::GetFilesInDir(new_path, listing, filter);24return true;25}26return false;27}2829bool DirectoryReader::GetFileInfo(const char *path, File::FileInfo *info) {30Path new_path = Path(path).StartsWith(path_) ? Path(path) : path_ / path;31return File::GetFileInfo(new_path, info);32}3334class DirectoryReaderFileReference : public VFSFileReference {35public:36Path path;37};3839class DirectoryReaderOpenFile : public VFSOpenFile {40public:41~DirectoryReaderOpenFile() {42_dbg_assert_(file == nullptr);43}44FILE *file = nullptr;45};4647VFSFileReference *DirectoryReader::GetFile(const char *path) {48Path filePath = path_ / path;49if (!File::Exists(filePath)) {50return nullptr;51}5253DirectoryReaderFileReference *reference = new DirectoryReaderFileReference();54reference->path = filePath;55return reference;56}5758bool DirectoryReader::GetFileInfo(VFSFileReference *vfsReference, File::FileInfo *fileInfo) {59DirectoryReaderFileReference *reference = (DirectoryReaderFileReference *)vfsReference;60return File::GetFileInfo(reference->path, fileInfo);61}6263void DirectoryReader::ReleaseFile(VFSFileReference *vfsReference) {64DirectoryReaderFileReference *reference = (DirectoryReaderFileReference *)vfsReference;65delete reference;66}6768VFSOpenFile *DirectoryReader::OpenFileForRead(VFSFileReference *vfsReference, size_t *size) {69DirectoryReaderFileReference *reference = (DirectoryReaderFileReference *)vfsReference;70FILE *file = File::OpenCFile(reference->path, "rb");71if (!file) {72return nullptr;73}74fseek(file, 0, SEEK_END);75*size = ftell(file);76fseek(file, 0, SEEK_SET);77DirectoryReaderOpenFile *openFile = new DirectoryReaderOpenFile();78openFile->file = file;79return openFile;80}8182void DirectoryReader::Rewind(VFSOpenFile *vfsOpenFile) {83DirectoryReaderOpenFile *openFile = (DirectoryReaderOpenFile *)vfsOpenFile;84fseek(openFile->file, 0, SEEK_SET);85}8687size_t DirectoryReader::Read(VFSOpenFile *vfsOpenFile, void *buffer, size_t length) {88DirectoryReaderOpenFile *openFile = (DirectoryReaderOpenFile *)vfsOpenFile;89return fread(buffer, 1, length, openFile->file);90}9192void DirectoryReader::CloseFile(VFSOpenFile *vfsOpenFile) {93DirectoryReaderOpenFile *openFile = (DirectoryReaderOpenFile *)vfsOpenFile;94_dbg_assert_(openFile->file != nullptr);95fclose(openFile->file);96openFile->file = nullptr;97delete openFile;98}99100101