some modifications about directory feature

pull/152/head
x86kernel 10 years ago
parent a541dd35f8
commit 21214f2860

@ -47,13 +47,17 @@ public:
{
close();
std::list<std::string> dirs;
const char* mode = truncate ? "wb" : "ab";
_filename = fname;
for (int tries = 0; tries < open_tries; ++tries)
{
if (os::dir_check(fname, dirs))
if(os::create_dirs(dirs))
if (dir_check(fname))
{
get_dirlist(fname, dirs);
if(create_dirs(dirs))
break;
}
if(!os::fopen_s(&_fd, fname, mode))
return;
@ -133,11 +137,81 @@ public:
return os::file_exists(name);
}
//Return true if filenamd contains relative path
bool dir_check(const std::string &name)
{
std::string::size_type index = 0;
index = name.find("/", index);
if(index != std::string::npos)
return true;
return false;
}
//Get list contain directories name
void get_dirlist(const std::string &name, std::list<std::string>& dirs)
{
std::string directory;
std::string::size_type index, previndex = 0;
index = name.find("/", previndex);
if(!index)
dirs.push_back("/");
do {
if(index - previndex == 0)
directory = name.substr(previndex, index - previndex + 1);
else
directory = name.substr(previndex, index - previndex);
if(directory != "/")
dirs.push_back(directory);
previndex = index + 1;
index = name.find("/", previndex);
}while(index != std::string::npos);
}
//Create directories by referring to list
//Return 0 if success
bool create_dirs(std::list<std::string>& dirs)
{
std::string origin_path, dirname;
std::list<std::string>::iterator li;
int r;
origin_path = os::getpwd();
for(li = dirs.begin(); li != dirs.end(); ++li) {
dirname = *li;
r = os::_mkdir(dirname);
if(r)
{
#ifdef _WIN32
//not yet
#else
if(os::get_lasterror() != EEXIST)
return r;
#endif
}
r = os::_chdir(dirname);
if(r) return r;
}
r = os::_chdir(origin_path);
if(r) return r;
return 0;
}
private:
FILE* _fd;
std::list<std::string> dirs;
std::string _filename;
bool _force_flush;

@ -129,63 +129,41 @@ constexpr inline unsigned short eol_size()
}
#endif
//Return true and list if filename contains relative
inline bool dir_check(const std::string& filename, std::list<std::string>& dirs)
{
#ifdef __linux__
std::string directory;
std::string::size_type index, previndex = 0, size;
index = filename.find("/", previndex);
if(!index)
dirs.push_back("/");
do {
if(index - previndex == 0)
directory = filename.substr(previndex, index - previndex + 1);
else
directory = filename.substr(previndex, index - previndex);
if(directory != "/")
dirs.push_back(directory);
previndex = index + 1;
index = filename.find("/", previndex);
}while(index != std::string::npos);
return true;
inline int get_lasterror()
{
#ifdef _WIN32
//not yet
#else
return errno;
#endif
}
//Create directories by referring to list
//Return 0 if success
inline bool create_dirs(std::list<std::string>& dirs)
inline std::string getpwd()
{
#ifdef __linux__
std::string origin_path;
std::list<std::string>::iterator li;
int r;
origin_path = get_current_dir_name();
for(li = dirs.begin(); li != dirs.end(); ++li) {
r = mkdir((*li).c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
if(r && errno != EEXIST)
return r;
r = chdir((*li).c_str());
if(r) return r;
}
r = chdir(origin_path.c_str());
if(r) return r;
return 0;
#ifdef _WIN32
//not yet
#else
return get_current_dir_name();
#endif
}
inline bool _mkdir(const std::string& dirname)
{
#ifdef _WIN32
//not yet
#else
return mkdir(dirname.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
#endif
}
inline bool _chdir(const std::string& dirname)
{
#ifdef _WIN32
//not yet
#else
return chdir(dirname.c_str());
#endif
}
//fopen_s on non windows for writing

Loading…
Cancel
Save