/* * * Copyright (c) 2006 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include "qpid/sys/FileSysDir.h" #include "qpid/sys/StrError.h" #include "qpid/Exception.h" #include #include #include #include #include #include namespace qpid { namespace sys { bool FileSysDir::exists (void) const { const char *cpath = dirPath.c_str (); struct _stat s; if (::_stat(cpath, &s)) { if (errno == ENOENT) { return false; } throw qpid::Exception (strError(errno) + ": Can't check directory: " + dirPath); } if (s.st_mode & _S_IFDIR) return true; throw qpid::Exception(dirPath + " is not a directory"); } void FileSysDir::mkdir(void) { if (::_mkdir(dirPath.c_str()) == -1) throw Exception ("Can't create directory: " + dirPath); } void FileSysDir::forEachFile(Callback cb) const { WIN32_FIND_DATAA findFileData; char szDir[MAX_PATH]; size_t dirPathLength; HANDLE hFind = INVALID_HANDLE_VALUE; // create dirPath+"\*" in szDir StringCchLength (dirPath.c_str(), MAX_PATH, &dirPathLength); if (dirPathLength > (MAX_PATH - 3)) { throw Exception ("Directory path is too long: " + dirPath); } StringCchCopy(szDir, MAX_PATH, dirPath.c_str()); StringCchCat(szDir, MAX_PATH, TEXT("\\*")); // Special work for first file hFind = FindFirstFileA(szDir, &findFileData); if (INVALID_HANDLE_VALUE == hFind) { return; } // process everything that isn't a directory do { if (!(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { std::string fileName(findFileData.cFileName); cb(fileName); } } while (FindNextFile(hFind, &findFileData) != 0); } }} // namespace qpid::sys