static BOOL RemoveEmptyDirectory(WCHAR *dir) { WIN32_FIND_DATA findData; BOOL success = TRUE; ScopedMem<WCHAR> dirPattern(path::Join(dir, L"*")); HANDLE h = FindFirstFile(dirPattern, &findData); if (h != INVALID_HANDLE_VALUE) { do { ScopedMem<WCHAR> path(path::Join(dir, findData.cFileName)); DWORD attrs = findData.dwFileAttributes; // filter out directories. Even though there shouldn't be any // subdirectories, it also filters out the standard "." and ".." if ((attrs & FILE_ATTRIBUTE_DIRECTORY) && !str::Eq(findData.cFileName, L".") && !str::Eq(findData.cFileName, L"..")) { success &= RemoveEmptyDirectory(path); } } while (FindNextFile(h, &findData) != 0); FindClose(h); } if (!RemoveDirectory(dir)) { DWORD lastError = GetLastError(); if (ERROR_DIR_NOT_EMPTY != lastError && ERROR_FILE_NOT_FOUND != lastError) { LogLastError(lastError); success = FALSE; } } return success; }
// Note: doesn't handle (total) sizes above 4GB static DWORD GetDirSize(const WCHAR *dir) { ScopedMem<WCHAR> dirPattern(path::Join(dir, L"*")); WIN32_FIND_DATA findData; HANDLE h = FindFirstFile(dirPattern, &findData); if (h == INVALID_HANDLE_VALUE) return 0; DWORD totalSize = 0; do { if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { totalSize += findData.nFileSizeLow; } else if (!str::Eq(findData.cFileName, L".") && !str::Eq(findData.cFileName, L"..")) { ScopedMem<WCHAR> subdir(path::Join(dir, findData.cFileName)); totalSize += GetDirSize(subdir); } } while (FindNextFile(h, &findData) != 0); FindClose(h); return totalSize; }
int LocalFileMng::savePattern( Song *song , const QString& drumkit_name, int selectedpattern , const QString& patternname, const QString& realpatternname, int mode) { //int mode = 1 save, int mode = 2 save as // INSTRUMENT NODE Instrument *instr = song->get_instrument_list()->get( 0 ); assert( instr ); Pattern *pat = song->get_pattern_list()->get( selectedpattern ); QString sPatternDir = Preferences::get_instance()->getDataDirectory() + "patterns/" + drumkit_name; INFOLOG( "[savePattern]" + sPatternDir ); // check if the directory exists QDir dir( sPatternDir ); QDir dirPattern( sPatternDir ); if ( !dir.exists() ) { dir.mkdir( sPatternDir );// create the drumkit directory } QString sPatternXmlFilename; // create the drumkit.xml file switch ( mode ){ case 1: //save sPatternXmlFilename = sPatternDir + "/" + QString( patternname + QString( ".h2pattern" )); break; case 2: //save as sPatternXmlFilename = patternname; break; case 3: //"save" but overwrite a existing pattern. mode 3 disable the last file exist check sPatternXmlFilename = sPatternDir + "/" + QString( patternname + QString( ".h2pattern" )); break; case 4: //tmp pattern needed by undo/redo sPatternXmlFilename = patternname; default: WARNINGLOG( "Pattern Save unknown status"); break; } //test if the file exists QFile testfile( sPatternXmlFilename ); if ( testfile.exists() && mode == 1) return 1; QDomDocument doc; QDomProcessingInstruction header = doc.createProcessingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\""); doc.appendChild( header ); QDomNode rootNode = doc.createElement( "drumkit_pattern" ); //LIB_ID just in work to get better usability //writeXmlString( &rootNode, "LIB_ID", "in_work" ); writeXmlString( rootNode, "pattern_for_drumkit", drumkit_name ); writeXmlString( rootNode, "author", song->get_author() ); writeXmlString( rootNode, "license", song->get_license() ); // pattern QDomNode patternNode = doc.createElement( "pattern" ); writeXmlString( patternNode, "pattern_name", realpatternname ); QString category; if ( pat->get_category().isEmpty() ) category = "No category"; else category = pat->get_category(); writeXmlString( patternNode, "info", pat->get_info() ); writeXmlString( patternNode, "category", category ); writeXmlString( patternNode, "size", QString("%1").arg( pat->get_length() ) ); QDomNode noteListNode = doc.createElement( "noteList" ); const Pattern::notes_t* notes = pat->get_notes(); FOREACH_NOTE_CST_IT_BEGIN_END(notes,it) { Note *pNote = it->second; assert( pNote ); QDomNode noteNode = doc.createElement( "note" ); writeXmlString( noteNode, "position", QString("%1").arg( pNote->get_position() ) ); writeXmlString( noteNode, "leadlag", QString("%1").arg( pNote->get_lead_lag() ) ); writeXmlString( noteNode, "velocity", QString("%1").arg( pNote->get_velocity() ) ); writeXmlString( noteNode, "pan_L", QString("%1").arg( pNote->get_pan_l() ) ); writeXmlString( noteNode, "pan_R", QString("%1").arg( pNote->get_pan_r() ) ); writeXmlString( noteNode, "pitch", QString("%1").arg( pNote->get_pitch() ) ); writeXmlString( noteNode, "key", pNote->key_to_string() ); writeXmlString( noteNode, "length", QString("%1").arg( pNote->get_length() ) ); writeXmlString( noteNode, "instrument", QString("%1").arg( pNote->get_instrument()->get_id() ) ); noteListNode.appendChild( noteNode ); }
/** @return true if the name contains only alphanumeric characters and the special characters _-!@#$%^() */ bool PWrapper::isValidName(const QString &name) { QRegExp dirPattern(_namePattern); return dirPattern.exactMatch(name); }