从文件名中获取目录, 有没有现成的函数?

验证码识别 2010-04-01 07:54:36
up up
...全文
254 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanwei1002 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]
TCHAR szPath[_MAX_PATH] = _T("F:\\MyProject\\DEMO\\Debug\\DEMO.exe");
TCHAR szDrive[_MAX_DRIVE] = {0};
TCHAR szDir[_MAX_DIR] = {0};
TCHAR szName[_MAX_FNAME] = {0};
TCHAR szExt[_MAX_EXT] = {0};
_t……
[/Quote]

这个高 学习了
jackson35296 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 schlafenhamster 的回复:]
*strrchr(filename,'\\')=0;
//filename现在只有目录了。
[/Quote]

支持该做法,简单明了
jackylvm 2010-04-02
  • 打赏
  • 举报
回复
问题最好描述清楚一些吧...如果是文件名里面就带着目录的..LZ也不会问了吧..

望LZ补充清楚问题.
Dingnifei123 2010-04-02
  • 打赏
  • 举报
回复
从文件Handle得到文件名,仅供参考!
源自网络

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <psapi.h>
#include <strsafe.h>
#define BUFSIZE 512BOOL GetFileNameFromHandle(HANDLE hFile)
{
BOOL bSuccess = FALSE;
TCHAR pszFilename[MAX_PATH+1];
HANDLE hFileMap;// Get the file size.
DWORD dwFileSizeHi = 0;
DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi);if( dwFileSizeLo == 0 && dwFileSizeHi == 0 )
{
printf("Cannot map a file with a length of zero.\n");
return FALSE;
}// Create a file mapping object.
hFileMap = CreateFileMapping(hFile,
NULL,
PAGE_READONLY,
0,
1,
NULL);if (hFileMap)
{
// Create a file mapping to get the file name.
void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1); if (pMem)
{
if (GetMappedFileName (GetCurrentProcess(),
pMem,
pszFilename,
MAX_PATH))
{ // Translate path with device name to drive letters.
TCHAR szTemp[BUFSIZE];
szTemp[0] = '\0'; if (GetLogicalDriveStrings(BUFSIZE-1, szTemp))
{
TCHAR szName[MAX_PATH];
TCHAR szDrive[3] = TEXT(" :");
BOOL bFound = FALSE;
TCHAR* p = szTemp; do
{
// Copy the drive letter to the template string
*szDrive = *p; // Look up each device name
if (QueryDosDevice(szDrive, szName, MAX_PATH))
{
UINT uNameLen = _tcslen(szName); if (uNameLen < MAX_PATH)
{
bFound = _tcsnicmp(pszFilename, szName,
uNameLen) == 0; if (bFound)
{
// Reconstruct pszFilename using szTempFile
// Replace device path with DOS path
TCHAR szTempFile[MAX_PATH];
StringCchPrintf(szTempFile,
MAX_PATH,
TEXT("%s%s"),
szDrive,
pszFilename+uNameLen);
StringCchCopyN(pszFilename, MAX_PATH+1, szTempFile, _tcslen(szTempFile));
}
}
} // Go to the next NULL character.
while (*p++);
} while (!bFound && *p); // end of string
}
}
bSuccess = TRUE;
UnmapViewOfFile(pMem);
} CloseHandle(hFileMap);
}
_tprintf(TEXT("File name is %s\n"), pszFilename);
return(bSuccess);

//http://hi.baidu.com/tr0j4n
}
int _tmain(int argc, TCHAR *argv[])
{
HANDLE hFile; if( argc != 2 )
{
printf("This sample takes a file name as a parameter.\n");
return 0;
}
hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL); if(hFile == INVALID_HANDLE_VALUE)
{
printf("CreateFile failed with %d\n", GetLastError());
return 0;
}
GetFileNameFromHandle( hFile );
}

副组长 2010-04-02
  • 打赏
  • 举报
回复
楼主说的不是带绝对路径的文件名吧?是不是就光杆一个文件名?要是这样的话可就废了,要看你的文件名是怎么来的了。
zhengguodun 2010-04-01
  • 打赏
  • 举报
回复
原来还可以_tsplitpath啊
我每次都是cstring find 来find去的
Eleven 2010-04-01
  • 打赏
  • 举报
回复
TCHAR szPath[_MAX_PATH] = _T("F:\\MyProject\\DEMO\\Debug\\DEMO.exe");
TCHAR szDrive[_MAX_DRIVE] = {0};
TCHAR szDir[_MAX_DIR] = {0};
TCHAR szName[_MAX_FNAME] = {0};
TCHAR szExt[_MAX_EXT] = {0};
_tsplitpath(szPath, szDrive, szDir, szName, szExt);

CString strText(_T(""));
strText += szDrive;
strText += szDir;
AfxMessageBox(strText);
skyfree 2010-04-01
  • 打赏
  • 举报
回复
没有,要自己写,c++做这么个操作就是几句话的事情
SullenSun 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zxdyu2009 的回复:]
文件名的路径都知道 了,你还懒啊。
应该没有的吧
1.CString strFile = "C:\\1.txt";

int nFind = strFile.ReverseFind('\\');
strFile = strFile.Left(nFind);
2.string strFile = "C:\\1.txt";
int nFind = strFile.find_last_of……
[/Quote]
up。。。
fishion 2010-04-01
  • 打赏
  • 举报
回复
splitpath
oyljerry 2010-04-01
  • 打赏
  • 举报
回复
splitpath_s()
然后再截取
验证码识别 2010-04-01
  • 打赏
  • 举报
回复
头 晕
schlafenhamster 2010-04-01
  • 打赏
  • 举报
回复
*strrchr(filename,'\\')=0;
//filename现在只有目录了。
zxdyu2009 2010-04-01
  • 打赏
  • 举报
回复
文件名的路径都知道 了,你还懒啊。
应该没有的吧
1.CString strFile = "C:\\1.txt";

int nFind = strFile.ReverseFind('\\');
strFile = strFile.Left(nFind);
2.string strFile = "C:\\1.txt";
int nFind = strFile.find_last_of('\\');
strFile = strFile.substr(0,nFind);

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧