bool WebIO::ListElements(std::string directory, std::vector<std::string> &list, bool files) { list.clear(); WIN32_FIND_DATA findFileData; bool result = false; DWORD dwAttribute = (files ? FILE_ATTRIBUTE_NORMAL : FILE_ATTRIBUTE_DIRECTORY); // Any filename. std::string tempDir; WebIO::GetDirectory(tempDir); WebIO::SetRelativeDirectory(directory); WebIO::m_hFile = FtpFindFirstFileA(WebIO::m_hConnect, "*", &findFileData, INTERNET_FLAG_RELOAD, NULL); if (WebIO::m_hFile != INVALID_HANDLE_VALUE) { do { //if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) continue; //if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) continue; if (findFileData.dwFileAttributes == dwAttribute) // No bitwise flag check, as it might return archives/offline/hidden or other files/dirs { //printf("%s: %X\n", findFileData.cFileName, findFileData.dwFileAttributes); list.push_back(findFileData.cFileName); result = true; } } while (InternetFindNextFileA(WebIO::m_hFile, &findFileData)); InternetCloseHandle(WebIO::m_hFile); } WebIO::SetDirectory(tempDir); return result; }
static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect) { WIN32_FIND_DATA findData; HINTERNET hSearch; HINTERNET hSearch2; HINTERNET hOpenFile; DWORD error; /* NULL as the search file ought to return the first file in the directory */ SetLastError(0xdeadbeef); hSearch = FtpFindFirstFileA(hFtp, NULL, &findData, 0, 0); ok ( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" ); /* This should fail as the previous handle wasn't closed */ SetLastError(0xdeadbeef); hSearch2 = FtpFindFirstFileA(hFtp, "welcome.msg", &findData, 0, 0); todo_wine ok ( hSearch2 == NULL, "Expected FtpFindFirstFileA to fail\n" ); todo_wine ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError() ); InternetCloseHandle(hSearch2); /* Just in case */ InternetCloseHandle(hSearch); /* Try a valid filename in a subdirectory search */ SetLastError(0xdeadbeef); hSearch = FtpFindFirstFileA(hFtp, "pub/wine", &findData, 0, 0); todo_wine ok ( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" ); InternetCloseHandle(hSearch); /* Try a valid filename in a subdirectory wildcard search */ SetLastError(0xdeadbeef); hSearch = FtpFindFirstFileA(hFtp, "pub/w*", &findData, 0, 0); todo_wine ok ( hSearch != NULL, "Expected FtpFindFirstFileA to pass\n" ); InternetCloseHandle(hSearch); /* Try an invalid wildcard search */ SetLastError(0xdeadbeef); hSearch = FtpFindFirstFileA(hFtp, "*/w*", &findData, 0, 0); ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" ); InternetCloseHandle(hSearch); /* Just in case */ /* Try FindFirstFile between FtpOpenFile and InternetCloseHandle */ SetLastError(0xdeadbeef); hOpenFile = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); ok ( hOpenFile != NULL, "Expected FtpOpenFileA to succeed\n" ); ok ( GetLastError() == ERROR_SUCCESS || broken(GetLastError() == ERROR_FILE_NOT_FOUND), /* Win98 */ "Expected ERROR_SUCCESS, got %u\n", GetLastError() ); /* This should fail as the OpenFile handle wasn't closed */ SetLastError(0xdeadbeef); hSearch = FtpFindFirstFileA(hFtp, "welcome.msg", &findData, 0, 0); error = GetLastError(); ok ( hSearch == NULL || broken(hSearch != NULL), /* win2k */ "Expected FtpFindFirstFileA to fail\n" ); if (!hSearch) ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error ); else { ok( error == ERROR_SUCCESS, "wrong error %u on success\n", GetLastError() ); InternetCloseHandle(hSearch); } InternetCloseHandle(hOpenFile); /* Test using a nonexistent filename */ SetLastError(0xdeadbeef); hSearch = FtpFindFirstFileA(hFtp, "this_file_should_not_exist", &findData, 0, 0); ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" ); todo_wine ok ( GetLastError() == ERROR_INTERNET_EXTENDED_ERROR, "Expected ERROR_INTERNET_EXTENDED_ERROR, got %d\n", GetLastError() ); InternetCloseHandle(hSearch); /* Just in case */ /* Test using a nonexistent filename and a wildcard */ SetLastError(0xdeadbeef); hSearch = FtpFindFirstFileA(hFtp, "this_file_should_not_exist*", &findData, 0, 0); ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" ); todo_wine ok ( GetLastError() == ERROR_NO_MORE_FILES, "Expected ERROR_NO_MORE_FILES, got %d\n", GetLastError() ); InternetCloseHandle(hSearch); /* Just in case */ /* Test using an invalid handle type */ SetLastError(0xdeadbeef); hSearch = FtpFindFirstFileA(hConnect, "welcome.msg", &findData, 0, 0); ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" ); ok ( GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError() ); InternetCloseHandle(hSearch); /* Just in case */ }
// Upload file bool FtpClient::upload(const string & source, const string & destination) { // Check connection if (mFtpHnd == NULL) { // Report error and break OutputDebugStringA("Not connected to FTP server:\n"); showError(); return false; } // Check if file exists if (!boost::filesystem::exists(boost::filesystem::path(source))) { // Report error and break OutputDebugStringA((string() + "\"" + source + "\" does not exist").c_str()); return false; } // Split destination to vector vector<string> mPath; boost::split(mPath, destination, boost::is_any_of("/")); // Iterate through directories LPCSTR mFilename; for (vector<string>::const_iterator mDirectory = mPath.cbegin(); mDirectory != mPath.cend(); ++mDirectory) { // End of the line if (mDirectory == mPath.end() - 1) { // Convert to character array mFilename = (LPCSTR)mDirectory->c_str(); } else { // Convert to character array LPCSTR nDirectory = (LPCSTR)mDirectory->c_str(); // Open directory if (!FtpSetCurrentDirectoryA(mFtpHnd, nDirectory)) { // Create directory if (!FtpCreateDirectoryA(mFtpHnd, nDirectory)) { // Report error and break OutputDebugStringA("Unable to create directory:\n"); showError(); return false; } else { // Open new directory if (!FtpSetCurrentDirectoryA(mFtpHnd, nDirectory)) { // Report error and break OutputDebugStringA("Unable to open new directory:\n"); showError(); return false; } } } } } // Check for existing file LPWIN32_FIND_DATAA mInfo = LPWIN32_FIND_DATAA(); HINTERNET mRemoteFileHnd = FtpFindFirstFileA(mFtpHnd, mFilename, mInfo, INTERNET_FLAG_RELOAD, 0); // Clean up memory LocalFree(mInfo); delete mInfo; // File exists if (mRemoteFileHnd != NULL) { // Warn OutputDebugStringA("File already exists. Overwriting.\n"); // Close remote file InternetCloseHandle(mRemoteFileHnd); // Delete file if (!FtpDeleteFileA(mFtpHnd, mFilename)) { // Report error and break OutputDebugStringA("Unable to delete file from server:\n"); showError(); mPath.clear(); return false; } } // Open remote file for upload HINTERNET mFileHnd = FtpOpenFileA(mFtpHnd, mFilename, GENERIC_WRITE, FTP_TRANSFER_TYPE_BINARY, 0); if (mFileHnd == NULL) { // Report error and break OutputDebugStringA("Unable to open remote file:\n"); showError(); return false; } // Open local file mFileIO.open(source.c_str(), ios::in|ios::binary|ios::ate); mFileSize = (DWORD)mFileIO.tellg(); mFileIO.seekg(0, ios::beg); // Return flag bool mUploadSuccess = false; // Check file size if (mFileSize > 0) { // Allocate memory for buffer and read file mBuffer = new int_fast8_t[mFileSize]; mFileIO.read(mBuffer, mFileSize); // Write buffer to remote file mBytesWritten = 0; mUploadSuccess = InternetWriteFile(mFileHnd, mBuffer, mFileSize, &mBytesWritten) == TRUE; if (!mUploadSuccess) showError(); // Clean up delete [] mBuffer; } // Close file, clean up mFileIO.close(); InternetCloseHandle(mFileHnd); mFileHnd = NULL; mPath.clear(); // Write result OutputDebugStringA(mUploadSuccess ? "File uploaded.\n" : "Upload did not complete.\n"); // Return flag return mUploadSuccess; }