本文整理汇总了C++中FindNextFileW函数的典型用法代码示例。如果您正苦于以下问题:C++ FindNextFileW函数的具体用法?C++ FindNextFileW怎么用?C++ FindNextFileW使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了FindNextFileW函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: do_searchW
static BOOL do_searchW(PCWSTR file, PWSTR buffer, BOOL recurse,
PENUMDIRTREE_CALLBACKW cb, PVOID user)
{
HANDLE h;
WIN32_FIND_DATAW fd;
unsigned pos;
BOOL found = FALSE;
static const WCHAR S_AllW[] = {'*','.','*','\0'};
static const WCHAR S_DotW[] = {'.','\0'};
static const WCHAR S_DotDotW[] = {'.','.','\0'};
pos = strlenW(buffer);
if (buffer[pos - 1] != '\\') buffer[pos++] = '\\';
strcpyW(buffer + pos, S_AllW);
if ((h = FindFirstFileW(buffer, &fd)) == INVALID_HANDLE_VALUE)
return FALSE;
/* doc doesn't specify how the tree is enumerated...
* doing a depth first based on, but may be wrong
*/
do
{
if (!strcmpW(fd.cFileName, S_DotW) || !strcmpW(fd.cFileName, S_DotDotW)) continue;
strcpyW(buffer + pos, fd.cFileName);
if (recurse && (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
found = do_searchW(file, buffer, TRUE, cb, user);
else if (SymMatchFileNameW(buffer, (WCHAR*)file, NULL, NULL))
{
if (!cb || cb(buffer, user)) found = TRUE;
}
} while (!found && FindNextFileW(h, &fd));
if (!found) buffer[--pos] = '\0';
FindClose(h);
return found;
}
示例2: PathConform
///////////////////////////////////////////////////////////////
//
// FindFiles
//
// Find all files or directories at a path
// If sorted by date, returns last modified last
//
///////////////////////////////////////////////////////////////
std::vector<SString> SharedUtil::FindFiles(const SString& strInMatch, bool bFiles, bool bDirectories, bool bSortByDate)
{
std::vector<SString> strResult;
std::multimap<uint64, SString> sortMap;
SString strMatch = PathConform(strInMatch);
if (strMatch.Right(1) == PATH_SEPERATOR)
strMatch += "*";
WIN32_FIND_DATAW findData;
HANDLE hFind = FindFirstFileW(FromUTF8(strMatch), &findData);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
if ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? bDirectories : bFiles)
if (wcscmp(findData.cFileName, L".") && wcscmp(findData.cFileName, L".."))
{
if (bSortByDate)
MapInsert(sortMap, (uint64&)findData.ftLastWriteTime, ToUTF8(findData.cFileName));
else
strResult.push_back(ToUTF8(findData.cFileName));
}
} while (FindNextFileW(hFind, &findData));
FindClose(hFind);
}
// Resolve sorted map if required
if (!sortMap.empty())
{
for (std::multimap<uint64, SString>::iterator iter = sortMap.begin(); iter != sortMap.end(); ++iter)
strResult.push_back(iter->second);
}
return strResult;
}
示例3: find_path_for_lates_log_file
std::wstring find_path_for_lates_log_file(const std::wstring& path_) {
auto search = path_ + L"\\combat_*.txt";
WIN32_FIND_DATAW info{};
auto handle = FindFirstFileW(search.c_str(), &info);
if ( handle != INVALID_HANDLE_VALUE ) {
BOOST_SCOPE_EXIT_ALL(= ) {
FindClose(handle);
};
auto last_info = info;
do {
BOOST_LOG_TRIVIAL(debug) << L"log file found " << info.cFileName;
if ( CompareFileTime(&last_info.ftCreationTime, &info.ftCreationTime) < 0 ) {
last_info = info;
}
} while ( FindNextFileW(handle, &info) );
BOOST_LOG_TRIVIAL(debug) << L"newest log file is " << last_info.cFileName;
return path_ + L"\\" + last_info.cFileName;
}
示例4: while
bool FileEnum::next_nt(bool& more) {
while (true) {
if (h_find == INVALID_HANDLE_VALUE) {
h_find = FindFirstFileW(long_path(file_mask).c_str(), &find_data);
if (h_find == INVALID_HANDLE_VALUE)
return false;
}
else {
if (!FindNextFileW(h_find, &find_data)) {
if (GetLastError() == ERROR_NO_MORE_FILES) {
more = false;
return true;
}
return false;
}
}
if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if ((find_data.cFileName[0] == L'.') && ((find_data.cFileName[1] == 0) || ((find_data.cFileName[1] == L'.') && (find_data.cFileName[2] == 0))))
continue;
}
more = true;
return true;
}
}
示例5: appStricmp
void FFileManagerWindows::InternalFindFiles( TArray<FString>& Result, const TCHAR* Filename, UBOOL Files, UBOOL Directories )
{
HANDLE Handle=NULL;
WIN32_FIND_DATAW Data;
Handle=FindFirstFileW(Filename,&Data);
if( Handle!=INVALID_HANDLE_VALUE )
{
do
{
if
( appStricmp(Data.cFileName,TEXT("."))
&& appStricmp(Data.cFileName,TEXT(".."))
&& ((Data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)?Directories:Files) )
{
new(Result)FString(Data.cFileName);
}
}
while( FindNextFileW(Handle,&Data) );
}
if( Handle!=INVALID_HANDLE_VALUE )
{
FindClose( Handle );
}
}
示例6: Java_net_rubygrapefruit_platform_internal_jni_WindowsFileFunctions_readdir
JNIEXPORT void JNICALL
Java_net_rubygrapefruit_platform_internal_jni_WindowsFileFunctions_readdir(JNIEnv *env, jclass target, jstring path, jobject contents, jobject result) {
jclass contentsClass = env->GetObjectClass(contents);
jmethodID mid = env->GetMethodID(contentsClass, "addFile", "(Ljava/lang/String;IJJ)V");
if (mid == NULL) {
mark_failed_with_message(env, "could not find method", result);
return;
}
WIN32_FIND_DATAW entry;
wchar_t* pathStr = java_to_wchar(env, path, result);
HANDLE dirHandle = FindFirstFileW(pathStr, &entry);
free(pathStr);
if (dirHandle == INVALID_HANDLE_VALUE) {
mark_failed_with_errno(env, "could not open directory", result);
return;
}
do {
if (wcscmp(L".", entry.cFileName) == 0 || wcscmp(L"..", entry.cFileName) == 0) {
continue;
}
jstring childName = wchar_to_java(env, entry.cFileName, wcslen(entry.cFileName), result);
jint type = (entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? FILE_TYPE_DIRECTORY : FILE_TYPE_FILE;
jlong lastModified = lastModifiedNanos(&entry.ftLastWriteTime);
jlong size = ((jlong)entry.nFileSizeHigh << 32) | entry.nFileSizeLow;
env->CallVoidMethod(contents, mid, childName, type, size, lastModified);
} while (FindNextFileW(dirHandle, &entry) != 0);
DWORD error = GetLastError();
if (error != ERROR_NO_MORE_FILES ) {
mark_failed_with_errno(env, "could not read next directory entry", result);
}
FindClose(dirHandle);
}
示例7: pBuildFileList
static SHIMGVW_FILENODE*
pBuildFileList(LPWSTR szFirstFile)
{
HANDLE hFindHandle;
WCHAR *extension;
WCHAR szSearchPath[MAX_PATH];
WCHAR szSearchMask[MAX_PATH];
WCHAR szFileTypes[MAX_PATH];
WIN32_FIND_DATAW findData;
SHIMGVW_FILENODE *currentNode;
SHIMGVW_FILENODE *root;
SHIMGVW_FILENODE *conductor;
ImageCodecInfo *codecInfo;
UINT num;
UINT size;
UINT j;
wcscpy(szSearchPath, szFirstFile);
PathRemoveFileSpecW(szSearchPath);
GdipGetImageDecodersSize(&num, &size);
codecInfo = malloc(size);
if (!codecInfo)
{
DPRINT1("malloc() failed in pLoadFileList()\n");
return NULL;
}
GdipGetImageDecoders(num, size, codecInfo);
root = malloc(sizeof(SHIMGVW_FILENODE));
if (!root)
{
DPRINT1("malloc() failed in pLoadFileList()\n");
free(codecInfo);
return NULL;
}
conductor = root;
for (j = 0; j < num; ++j)
{
StringCbPrintfExW(szFileTypes, MAX_PATH, NULL, NULL, 0, L"%ls", codecInfo[j].FilenameExtension);
extension = wcstok(szFileTypes, L";");
while (extension != NULL)
{
StringCbPrintfExW(szSearchMask, MAX_PATH, NULL, NULL, 0, L"%ls%ls%ls", szSearchPath, L"\\", extension);
hFindHandle = FindFirstFileW(szSearchMask, &findData);
if (hFindHandle != INVALID_HANDLE_VALUE)
{
do
{
StringCbPrintfExW(conductor->FileName, MAX_PATH, NULL, NULL, 0, L"%ls%ls%ls", szSearchPath, L"\\", findData.cFileName);
// compare the name of the requested file with the one currently found.
// if the name matches, the current node is returned by the function.
if (wcscmp(szFirstFile, conductor->FileName) == 0)
{
currentNode = conductor;
}
conductor->Next = malloc(sizeof(SHIMGVW_FILENODE));
// if malloc fails, make circular what we have and return it
if (!conductor->Next)
{
DPRINT1("malloc() failed in pLoadFileList()\n");
conductor->Next = root;
root->Prev = conductor;
FindClose(hFindHandle);
free(codecInfo);
return conductor;
}
conductor->Next->Prev = conductor;
conductor = conductor->Next;
}
while (FindNextFileW(hFindHandle, &findData) != 0);
FindClose(hFindHandle);
}
extension = wcstok(NULL, L";");
}
}
// we now have a node too much in the list. In case the requested file was not found,
// we use this node to store the name of it, otherwise we free it.
if (currentNode == NULL)
{
StringCbPrintfExW(conductor->FileName, MAX_PATH, NULL, NULL, 0, L"%ls", szFirstFile);
currentNode = conductor;
}
else
{
//.........这里部分代码省略.........
示例8: _CFContentsOfDirectory
//.........这里部分代码省略.........
if (moreDots == extBuffInteriorDotCount) {
fileExt = save;
}
}
}
if (!fileExt) continue; //no extension
if (((const wchar_t *)extBuff)[0] != '.')
fileExt++; //omit the dot if the target file extension omits the dot
CFIndex fileExtLen = wcslen(fileExt);
//if the extensions are different lengths, they can't possibly match
if (fileExtLen != targetExtLen) continue;
// Check to see if it matches the extension we're looking for.
if (_wcsicmp(fileExt, (const wchar_t *)extBuff) != 0) {
continue;
}
}
if (dirURL == NULL) {
CFStringRef dirURLStr = CFStringCreateWithBytes(alloc, (const uint8_t *)pathBuf, pathLength * sizeof(wchar_t), kCFStringEncodingUTF16, NO);
dirURL = CFURLCreateWithFileSystemPath(alloc, dirURLStr, kCFURLWindowsPathStyle, true);
CFRelease(dirURLStr);
releaseBase = true;
}
// MF:!!! What about the trailing slash?
CFStringRef fileURLStr = CFStringCreateWithBytes(alloc, (const uint8_t *)file.cFileName, namelen * sizeof(wchar_t), kCFStringEncodingUTF16, NO);
fileURL = CFURLCreateWithFileSystemPathRelativeToBase(alloc, fileURLStr, kCFURLWindowsPathStyle, (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? true : false, dirURL);
CFArrayAppendValue(files, fileURL);
CFRelease(fileURL);
CFRelease(fileURLStr);
} while (FindNextFileW(handle, &file));
FindClose(handle);
pathBuf[pathLength] = '\0';
#elif DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI || DEPLOYMENT_TARGET_LINUX || DEPLOYMENT_TARGET_FREEBSD
uint8_t extBuff[CFMaxPathSize];
int extBuffInteriorDotCount = 0; //people insist on using extensions like ".trace.plist", so we need to know how many dots back to look :(
if (targetExtLen > 0) {
CFStringGetBytes(extension, CFRangeMake(0, targetExtLen), CFStringFileSystemEncoding(), 0, false, extBuff, CFMaxPathLength, &targetExtLen);
extBuff[targetExtLen] = '\0';
char *extBuffStr = (char *)extBuff;
if (extBuffStr[0] == '.')
extBuffStr++; //skip the first dot, it's legitimate to have ".plist" for example
char *extBuffDotPtr = extBuffStr;
while ((extBuffDotPtr = strchr(extBuffStr, '.'))) { //find the next . in the extension...
extBuffInteriorDotCount++;
extBuffStr = extBuffDotPtr + 1;
}
}
uint8_t pathBuf[CFMaxPathSize];
if (!dirPath) {
if (!CFURLGetFileSystemRepresentation(dirURL, true, pathBuf, CFMaxPathLength)) {
if (extension) CFRelease(extension);
return NULL;
} else {
dirPath = (char *)pathBuf;
pathLength = strlen(dirPath);
}
}
示例9: ACTION_RecurseSearchDirectory
/* Recursively searches the directory dir for files that match the signature
* sig, up to (depth + 1) levels deep. That is, if depth is 0, it searches dir
* (and only dir). If depth is 1, searches dir and its immediate
* subdirectories.
* Assumes sig->File is not NULL.
* Returns ERROR_SUCCESS on success (which may include non-critical errors),
* something else on failures which should halt the install.
*/
static UINT ACTION_RecurseSearchDirectory(MSIPACKAGE *package, LPWSTR *appValue,
MSISIGNATURE *sig, LPCWSTR dir, int depth)
{
HANDLE hFind;
WIN32_FIND_DATAW findData;
UINT rc = ERROR_SUCCESS;
size_t dirLen = lstrlenW(dir), fileLen = lstrlenW(sig->File);
WCHAR subpath[MAX_PATH];
WCHAR *buf;
DWORD len;
static const WCHAR starDotStarW[] = { '*','.','*',0 };
TRACE("Searching directory %s for file %s, depth %d\n", debugstr_w(dir),
debugstr_w(sig->File), depth);
if (depth < 0)
return ERROR_SUCCESS;
*appValue = NULL;
/* We need the buffer in both paths below, so go ahead and allocate it
* here. Add two because we might need to add a backslash if the dir name
* isn't backslash-terminated.
*/
len = dirLen + max(fileLen, strlenW(starDotStarW)) + 2;
buf = msi_alloc(len * sizeof(WCHAR));
if (!buf)
return ERROR_OUTOFMEMORY;
lstrcpyW(buf, dir);
PathAddBackslashW(buf);
lstrcatW(buf, sig->File);
hFind = FindFirstFileW(buf, &findData);
if (hFind != INVALID_HANDLE_VALUE)
{
if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
BOOL matches;
rc = ACTION_FileMatchesSig(sig, &findData, buf, &matches);
if (rc == ERROR_SUCCESS && matches)
{
TRACE("found file, returning %s\n", debugstr_w(buf));
*appValue = buf;
}
}
FindClose(hFind);
}
if (rc == ERROR_SUCCESS && !*appValue)
{
lstrcpyW(buf, dir);
PathAddBackslashW(buf);
lstrcatW(buf, starDotStarW);
hFind = FindFirstFileW(buf, &findData);
if (hFind != INVALID_HANDLE_VALUE)
{
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
lstrcmpW(findData.cFileName, szDot) &&
lstrcmpW(findData.cFileName, szDotDot))
{
lstrcpyW(subpath, dir);
PathAppendW(subpath, findData.cFileName);
rc = ACTION_RecurseSearchDirectory(package, appValue, sig,
subpath, depth - 1);
}
while (rc == ERROR_SUCCESS && !*appValue &&
FindNextFileW(hFind, &findData) != 0)
{
if (!lstrcmpW(findData.cFileName, szDot) ||
!lstrcmpW(findData.cFileName, szDotDot))
continue;
lstrcpyW(subpath, dir);
PathAppendW(subpath, findData.cFileName);
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
rc = ACTION_RecurseSearchDirectory(package, appValue,
sig, subpath, depth - 1);
}
FindClose(hFind);
}
}
if (*appValue != buf)
msi_free(buf);
return rc;
}
示例10: strcpyw
HANDLE FindFile::Win32Find(HANDLE hFind,const char *Mask,const wchar *MaskW,struct FindData *fd)
{
#ifndef _WIN_CE
if (WinNT())
#endif
{
wchar WideMask[NM];
if (MaskW!=NULL && *MaskW!=0)
strcpyw(WideMask,MaskW);
else
CharToWide(Mask,WideMask);
WIN32_FIND_DATAW FindData;
if (hFind==INVALID_HANDLE_VALUE)
{
hFind=FindFirstFileW(WideMask,&FindData);
if (hFind==INVALID_HANDLE_VALUE)
{
int SysErr=GetLastError();
fd->Error=(SysErr!=ERROR_FILE_NOT_FOUND &&
SysErr!=ERROR_PATH_NOT_FOUND &&
SysErr!=ERROR_NO_MORE_FILES);
}
}
else
if (!FindNextFileW(hFind,&FindData))
{
hFind=INVALID_HANDLE_VALUE;
fd->Error=GetLastError()!=ERROR_NO_MORE_FILES;
}
if (hFind!=INVALID_HANDLE_VALUE)
{
strcpyw(fd->NameW,WideMask);
strcpyw(PointToName(fd->NameW),FindData.cFileName);
WideToChar(fd->NameW,fd->Name);
fd->Size=int32to64(FindData.nFileSizeHigh,FindData.nFileSizeLow);
fd->FileAttr=FindData.dwFileAttributes;
WideToChar(FindData.cAlternateFileName,fd->ShortName);
fd->ftCreationTime=FindData.ftCreationTime;
fd->ftLastAccessTime=FindData.ftLastAccessTime;
fd->ftLastWriteTime=FindData.ftLastWriteTime;
fd->mtime=FindData.ftLastWriteTime;
fd->ctime=FindData.ftCreationTime;
fd->atime=FindData.ftLastAccessTime;
fd->FileTime=fd->mtime.GetDos();
#ifndef _WIN_CE
if (LowAscii(fd->NameW))
*fd->NameW=0;
#endif
}
}
#ifndef _WIN_CE
else
{
char CharMask[NM];
if (Mask!=NULL && *Mask!=0)
strcpy(CharMask,Mask);
else
WideToChar(MaskW,CharMask);
WIN32_FIND_DATA FindData;
if (hFind==INVALID_HANDLE_VALUE)
{
hFind=FindFirstFile(CharMask,&FindData);
if (hFind==INVALID_HANDLE_VALUE)
{
int SysErr=GetLastError();
fd->Error=SysErr!=ERROR_FILE_NOT_FOUND && SysErr!=ERROR_PATH_NOT_FOUND;
}
}
else
if (!FindNextFile(hFind,&FindData))
{
hFind=INVALID_HANDLE_VALUE;
fd->Error=GetLastError()!=ERROR_NO_MORE_FILES;
}
if (hFind!=INVALID_HANDLE_VALUE)
{
strcpy(fd->Name,CharMask);
strcpy(PointToName(fd->Name),FindData.cFileName);
CharToWide(fd->Name,fd->NameW);
fd->Size=int32to64(FindData.nFileSizeHigh,FindData.nFileSizeLow);
fd->FileAttr=FindData.dwFileAttributes;
strcpy(fd->ShortName,FindData.cAlternateFileName);
fd->ftCreationTime=FindData.ftCreationTime;
fd->ftLastAccessTime=FindData.ftLastAccessTime;
fd->ftLastWriteTime=FindData.ftLastWriteTime;
fd->mtime=FindData.ftLastWriteTime;
fd->ctime=FindData.ftCreationTime;
fd->atime=FindData.ftLastAccessTime;
fd->FileTime=fd->mtime.GetDos();
if (LowAscii(fd->Name))
*fd->NameW=0;
}
}
#endif
fd->Flags=0;
//.........这里部分代码省略.........
示例11: if
//.........这里部分代码省略.........
return ZtringList();
BOOL ReturnValue;
do
{
#ifdef UNICODE
Ztring File_Name;
#ifndef ZENLIB_NO_WIN9X_SUPPORT
if (IsWin9X_Fast())
File_Name=FindFileDataA.cFileName;
else
#endif //ZENLIB_NO_WIN9X_SUPPORT
File_Name=FindFileDataW.cFileName;
#else
Ztring File_Name(FindFileData.cFileName);
#endif //UNICODE
if (File_Name!=_T(".") && File_Name!=_T("..")) //Avoid . an ..
{
Ztring File_Name_Complete=Path+_T("\\")+File_Name;
if (Exists(File_Name_Complete))
{
if (Options&Parse_SubDirs)
ToReturn+=GetAllFileNames(File_Name_Complete, Options); //A SubDir
}
else if ((Options&Include_Hidden) || (!File_Name.empty() && File_Name[0]!=_T('.')))
ToReturn.push_back(File_Name_Complete); //A file
}
#ifdef UNICODE
#ifndef ZENLIB_NO_WIN9X_SUPPORT
if (IsWin9X_Fast())
ReturnValue=FindNextFileA(hFind, &FindFileDataA);
else
#endif //ZENLIB_NO_WIN9X_SUPPORT
ReturnValue=FindNextFileW(hFind, &FindFileDataW);
#else
ReturnValue=FindNextFile(hFind, &FindFileData);
#endif //UNICODE
}
while (ReturnValue);
FindClose(hFind);
#else //WINDOWS
//A file?
if (File::Exists(Dir_Name))
{
ToReturn.push_back(Dir_Name); //TODO
return ToReturn;
}
//A dir?
if (!Dir::Exists(Dir_Name))
return ToReturn; //Does not exist
//open
#ifdef UNICODE
DIR* Dir=opendir(Dir_Name.To_Local().c_str());
#else
DIR* Dir=opendir(Dir_Name.c_str());
#endif //UNICODE
if (Dir)
{
//This is a dir
//Normalizing dir (the / at the end)
size_t Dir_Pos=Dir_Name.rfind(FileName_PathSeparator);
if (Dir_Pos==std::string::npos)
Dir_Name+=FileName_PathSeparator;
示例12: ProcessWindowsFileProtection
/*
* WFP is Windows File Protection, in NT5 and Windows 2000 it maintains a cache
* of known good dlls and scans through and replaces corrupted DLLs with these
* known good versions. The only programs that should install into this dll
* cache are Windows Updates and IE (which is treated like a Windows Update)
*
* Implementing this allows installing ie in win2k mode to actually install the
* system dlls that we expect and need
*/
static int ProcessWindowsFileProtection(void)
{
static const WCHAR winlogonW[] = {'S','o','f','t','w','a','r','e','\\',
'M','i','c','r','o','s','o','f','t','\\',
'W','i','n','d','o','w','s',' ','N','T','\\',
'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
'W','i','n','l','o','g','o','n',0};
static const WCHAR cachedirW[] = {'S','F','C','D','l','l','C','a','c','h','e','D','i','r',0};
static const WCHAR dllcacheW[] = {'\\','d','l','l','c','a','c','h','e','\\','*',0};
static const WCHAR wildcardW[] = {'\\','*',0};
WIN32_FIND_DATAW finddata;
HANDLE find_handle;
BOOL find_rc;
DWORD rc;
HKEY hkey;
LPWSTR dllcache = NULL;
if (!RegOpenKeyW( HKEY_LOCAL_MACHINE, winlogonW, &hkey ))
{
DWORD sz = 0;
if (!RegQueryValueExW( hkey, cachedirW, 0, NULL, NULL, &sz))
{
sz += sizeof(WCHAR);
dllcache = HeapAlloc(GetProcessHeap(),0,sz + sizeof(wildcardW));
RegQueryValueExW( hkey, cachedirW, 0, NULL, (LPBYTE)dllcache, &sz);
strcatW( dllcache, wildcardW );
}
}
RegCloseKey(hkey);
if (!dllcache)
{
DWORD sz = GetSystemDirectoryW( NULL, 0 );
dllcache = HeapAlloc( GetProcessHeap(), 0, sz * sizeof(WCHAR) + sizeof(dllcacheW));
GetSystemDirectoryW( dllcache, sz );
strcatW( dllcache, dllcacheW );
}
find_handle = FindFirstFileW(dllcache,&finddata);
dllcache[ strlenW(dllcache) - 2] = 0; /* strip off wildcard */
find_rc = find_handle != INVALID_HANDLE_VALUE;
while (find_rc)
{
static const WCHAR dotW[] = {'.',0};
static const WCHAR dotdotW[] = {'.','.',0};
WCHAR targetpath[MAX_PATH];
WCHAR currentpath[MAX_PATH];
UINT sz;
UINT sz2;
WCHAR tempfile[MAX_PATH];
if (strcmpW(finddata.cFileName,dotW) == 0 || strcmpW(finddata.cFileName,dotdotW) == 0)
{
find_rc = FindNextFileW(find_handle,&finddata);
continue;
}
sz = MAX_PATH;
sz2 = MAX_PATH;
VerFindFileW(VFFF_ISSHAREDFILE, finddata.cFileName, windowsdir,
windowsdir, currentpath, &sz, targetpath, &sz2);
sz = MAX_PATH;
rc = VerInstallFileW(0, finddata.cFileName, finddata.cFileName,
dllcache, targetpath, currentpath, tempfile, &sz);
if (rc != ERROR_SUCCESS)
{
WINE_WARN("WFP: %s error 0x%x\n",wine_dbgstr_w(finddata.cFileName),rc);
DeleteFileW(tempfile);
}
/* now delete the source file so that we don't try to install it over and over again */
lstrcpynW( targetpath, dllcache, MAX_PATH - 1 );
sz = strlenW( targetpath );
targetpath[sz++] = '\\';
lstrcpynW( targetpath + sz, finddata.cFileName, MAX_PATH - sz );
if (!DeleteFileW( targetpath ))
WINE_WARN( "failed to delete %s: error %u\n", wine_dbgstr_w(targetpath), GetLastError() );
find_rc = FindNextFileW(find_handle,&finddata);
}
FindClose(find_handle);
HeapFree(GetProcessHeap(),0,dllcache);
return 1;
}
示例13: return
bool Directory::read()
{
if (!is_open())
{
return(false);
}
#ifdef _MSC_VER
while (!m_eof)
{
const std::wstring file_name(m_file.cFileName);
const DWORD file_type = m_file.dwFileAttributes;
m_eof = !FindNextFileW(m_dir, &m_file);
if (L"." == file_name || L".." == file_name)
{
continue;
}
if (FILE_ATTRIBUTE_DIRECTORY == (FILE_ATTRIBUTE_DIRECTORY & file_type))
{
m_current_sub_path_short_name = unicode_to_utf8(file_name);
m_current_sub_path_name = m_dir_name + m_current_sub_path_short_name + g_directory_separator;
m_current_sub_path_is_directory = true;
}
else
{
m_current_sub_path_short_name = unicode_to_utf8(file_name);
m_current_sub_path_name = m_dir_name + m_current_sub_path_short_name;
m_current_sub_path_is_directory = false;
}
return(true);
}
#else
while (nullptr != m_file)
{
/*
* do not do like this:
* struct dirent * file = m_file;
* m_file = readdir(m_dir);
* operate_function(file);
* the behavior is undefined, the result is not expected
*/
const std::string d_name(m_file->d_name);
#if 0
const size_t d_type = m_file->d_type;
#endif // 0
m_file = readdir(m_dir);
if ("." == d_name || ".." == d_name)
{
continue;
}
#if 0
/*
* d_type: not supported by all filesystem
*/
if (DT_DIR == (DT_DIR & d_type))
{
m_current_sub_path_short_name = ansi_to_utf8(d_name);
m_current_sub_path_name = m_dir_name + m_current_sub_path_short_name + g_directory_separator;
m_current_sub_path_is_directory = true;
return(true);
}
else if (DT_REG == (DT_REG & d_type))
{
m_current_sub_path_short_name = ansi_to_utf8(d_name);
m_current_sub_path_name = m_dir_name + m_current_sub_path_short_name;
m_current_sub_path_is_directory = false;
return(true);
}
#else
stupid_stat_t stat_buf = { 0x00 };
const std::string file_name(utf8_to_ansi(m_dir_name) + d_name);
if (0 != stupid_stat(file_name.c_str(), &stat_buf))
{
continue;
}
if (S_IFDIR == (S_IFDIR & stat_buf.st_mode))
{
m_current_sub_path_short_name = ansi_to_utf8(d_name);
m_current_sub_path_name = m_dir_name + m_current_sub_path_short_name + g_directory_separator;
m_current_sub_path_is_directory = true;
return(true);
}
else if (S_IFREG == (S_IFREG & stat_buf.st_mode))
{
m_current_sub_path_short_name = ansi_to_utf8(d_name);
m_current_sub_path_name = m_dir_name + m_current_sub_path_short_name;
m_current_sub_path_is_directory = false;
return(true);
}
#endif // 0
}
#endif // _MSC_VER
m_current_sub_path_short_name.clear();
//.........这里部分代码省略.........
示例14: DeleteDirectory
static int DeleteDirectory(wchar_t *refcstrRootDirectory)
{
#define DEFAULT_PATTERN L"%s/*.*"
BOOL bDeleteSubdirectories = TRUE;
BOOL bSubdirectory = FALSE;
HANDLE hFile;
WIN32_FIND_DATAW FileInformation;
DWORD dwError;
wchar_t *strPattern = NULL;
wchar_t *strFilePath = NULL;
int len = 0;
if (refcstrRootDirectory == NULL) return 1;
len = (int)(wcslen(refcstrRootDirectory) + (int)wcslen(DEFAULT_PATTERN) + 1);
strPattern = (wchar_t*)MALLOC(sizeof(wchar_t) * len);
if (strPattern)
{
swprintf(strPattern, len, DEFAULT_PATTERN, refcstrRootDirectory);
}
else
{
return 1;
}
hFile = FindFirstFileW(strPattern, &FileInformation);
if (strPattern) { FREE(strPattern);strPattern=NULL;}
if(hFile != INVALID_HANDLE_VALUE)
{
do
{
if ( (wcscmp(FileInformation.cFileName,L".") != 0) && (wcscmp(FileInformation.cFileName,L"..") != 0) )
{
#define FORMAT_PATH_TO_REMOVE L"%s\\%s"
int len = (int) (wcslen(refcstrRootDirectory) + wcslen(FORMAT_PATH_TO_REMOVE) + wcslen((wchar_t*)(FileInformation.cFileName)) + 1);
strFilePath = (wchar_t*) MALLOC(sizeof(wchar_t) * len);
if (strFilePath)
{
swprintf(strFilePath, len, FORMAT_PATH_TO_REMOVE, refcstrRootDirectory, FileInformation.cFileName);
}
if(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(bDeleteSubdirectories)
{
int iRC = DeleteDirectory(strFilePath);
if (strFilePath) {FREE(strFilePath); strFilePath = NULL;}
if (strPattern) {FREE(strPattern); strPattern = NULL;}
if(iRC)
{
return iRC;
}
}
else bSubdirectory = TRUE;
}
else
{
if(SetFileAttributesW(strFilePath,FILE_ATTRIBUTE_NORMAL) == FALSE)
{
if (strFilePath) {FREE(strFilePath); strFilePath = NULL;}
if (strPattern) {FREE(strPattern); strPattern = NULL;}
return GetLastError();
}
if(DeleteFileW(strFilePath) == FALSE)
{
if (strFilePath) {FREE(strFilePath); strFilePath = NULL;}
if (strPattern) {FREE(strPattern); strPattern = NULL;}
return GetLastError();
}
}
}
} while(FindNextFileW(hFile, &FileInformation) == TRUE);
FindClose(hFile);
if (strFilePath) {FREE(strFilePath); strFilePath = NULL;}
if (strPattern) {FREE(strPattern); strPattern = NULL;}
dwError = GetLastError();
if(dwError != ERROR_NO_MORE_FILES)
{
return dwError;
}
else
{
if(!bSubdirectory)
{
if(SetFileAttributesW(refcstrRootDirectory,FILE_ATTRIBUTE_NORMAL) == FALSE)
{
return GetLastError();
}
if(RemoveDirectoryW(refcstrRootDirectory) == FALSE)
{
return GetLastError();
}
}
}
//.........这里部分代码省略.........
示例15: RTDECL
RTDECL(int) RTDirReadEx(PRTDIR pDir, PRTDIRENTRYEX pDirEntry, size_t *pcbDirEntry, RTFSOBJATTRADD enmAdditionalAttribs, uint32_t fFlags)
{
/** @todo Symlinks: Find[First|Next]FileW will return info about
the link, so RTPATH_F_FOLLOW_LINK is not handled correctly. */
/*
* Validate input.
*/
if (!pDir || pDir->u32Magic != RTDIR_MAGIC)
{
AssertMsgFailed(("Invalid pDir=%p\n", pDir));
return VERR_INVALID_PARAMETER;
}
if (!pDirEntry)
{
AssertMsgFailed(("Invalid pDirEntry=%p\n", pDirEntry));
return VERR_INVALID_PARAMETER;
}
if ( enmAdditionalAttribs < RTFSOBJATTRADD_NOTHING
|| enmAdditionalAttribs > RTFSOBJATTRADD_LAST)
{
AssertMsgFailed(("Invalid enmAdditionalAttribs=%p\n", enmAdditionalAttribs));
return VERR_INVALID_PARAMETER;
}
AssertMsgReturn(RTPATH_F_IS_VALID(fFlags, 0), ("%#x\n", fFlags), VERR_INVALID_PARAMETER);
size_t cbDirEntry = sizeof(*pDirEntry);
if (pcbDirEntry)
{
cbDirEntry = *pcbDirEntry;
if (cbDirEntry < RT_UOFFSETOF(RTDIRENTRYEX, szName[2]))
{
AssertMsgFailed(("Invalid *pcbDirEntry=%d (min %d)\n", *pcbDirEntry, RT_OFFSETOF(RTDIRENTRYEX, szName[2])));
return VERR_INVALID_PARAMETER;
}
}
/*
* Fetch data?
*/
if (!pDir->fDataUnread)
{
RTStrFree(pDir->pszName);
pDir->pszName = NULL;
BOOL fRc = FindNextFileW(pDir->hDir, &pDir->Data);
if (!fRc)
{
int iErr = GetLastError();
if (pDir->hDir == INVALID_HANDLE_VALUE || iErr == ERROR_NO_MORE_FILES)
return VERR_NO_MORE_FILES;
return RTErrConvertFromWin32(iErr);
}
}
/*
* Convert the filename to UTF-8.
*/
if (!pDir->pszName)
{
int rc = RTUtf16ToUtf8((PCRTUTF16)pDir->Data.cFileName, &pDir->pszName);
if (RT_FAILURE(rc))
{
pDir->pszName = NULL;
return rc;
}
pDir->cchName = strlen(pDir->pszName);
}
/*
* Check if we've got enough space to return the data.
*/
const char *pszName = pDir->pszName;
const size_t cchName = pDir->cchName;
const size_t cbRequired = RT_OFFSETOF(RTDIRENTRYEX, szName[1]) + cchName;
if (pcbDirEntry)
*pcbDirEntry = cbRequired;
if (cbRequired > cbDirEntry)
return VERR_BUFFER_OVERFLOW;
/*
* Setup the returned data.
*/
pDir->fDataUnread = false;
pDirEntry->cbName = (uint16_t)cchName;
Assert(pDirEntry->cbName == cchName);
memcpy(pDirEntry->szName, pszName, cchName + 1);
if (pDir->Data.cAlternateFileName[0])
{
/* copy and calc length */
PCRTUTF16 pwszSrc = (PCRTUTF16)pDir->Data.cAlternateFileName;
PRTUTF16 pwszDst = pDirEntry->wszShortName;
uint32_t off = 0;
while (off < RT_ELEMENTS(pDirEntry->wszShortName) - 1U && pwszSrc[off])
{
pwszDst[off] = pwszSrc[off];
off++;
}
pDirEntry->cwcShortName = (uint16_t)off;
/* zero the rest */
do
//.........这里部分代码省略.........