关于CFileDialog::GetNextPathName(POSITION& pos)的问题

搬不搬砖 2007-03-31 09:34:46
在vs2005下,

if (dlg.DoModal() == IDOK)
{
POSITION pos = dlg.GetStartPosition();

while (pos != 0)
{
CString s = dlg.GetNextPathName(pos);
}
}
,如果只选择了一个文件,则GetNextPathName会返回"c:\1.txt"这样的字串,
如果选择了多个文件,则会返回这样的字串:"c:\\1.txt",这边为什么会有两个斜杠呢?怎么才能把它去掉?
...全文
971 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
搬不搬砖 2012-10-23
  • 打赏
  • 举报
回复
突然发现有个贴没结贴,结了吧,5年多了
GGYYBOY 2007-04-01
  • 打赏
  • 举报
回复
好像Windows下的路径表示就是这样的吧
搬不搬砖 2007-04-01
  • 打赏
  • 举报
回复
我再说详细些
我用的是vs2005, 单步调试跟踪到GetNextPathName中
(在\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\mfc\dlgfile.cpp中),

发现最后几行如下:

if (*strDrive || *strDir)
{
Checked::tcscpy_s(strPath, _countof(strPath), strFileName);
}
else
{
Checked::tsplitpath_s(strBasePath+_T("\\"), strDrive, _MAX_DRIVE, strDir, _MAX_DIR, NULL, 0, NULL, 0);
Checked::tmakepath_s(strPath, _MAX_PATH, strDrive, strDir, strName, strExt);
}

问题就出在这个地方:strBasePath+_T("\\"),
这时strBasePath已经是c:\了,再加一个\就变成c:\\了,太奇怪了,为什么还要加一个\呢???

搬不搬砖 2007-04-01
  • 打赏
  • 举报
回复
所以才奇怪呀
yasmong 2007-04-01
  • 打赏
  • 举报
回复
不是吧,你的strBasePath应该是C:才对,在程序中,路径中的反斜杠要用两个反斜杠表示,而当你跟踪调试时会发现编译器会把双斜杠自动转换为了一个斜杠
菜牛 2007-03-31
  • 打赏
  • 举报
回复
我试了一下,也没有这个现象,你检查一下是否有其他代码处理过字符串。

CFileDialog dlgOpen(TRUE);
dlgOpen.GetOFN().Flags |= OFN_ALLOWMULTISELECT;
if (dlgOpen.DoModal() == IDOK)
{
m_lstFile.ResetContent();
POSITION pos = dlgOpen.GetStartPosition();
while (pos)
{
CString strFile = dlgOpen.GetNextPathName(pos);
m_lstFile.AddString(strFile);
TRACE0(strFile);
}
}
长尾巴的悟空 2007-03-31
  • 打赏
  • 举报
回复
绝对路径与相对路径?
搬不搬砖 2007-03-31
  • 打赏
  • 举报
回复
我把得到的字串加到一个listbox中,就发现了这个问题
菜牛 2007-03-31
  • 打赏
  • 举报
回复
你是怎么看出来有两个反斜杠的?用AfxMessageBox看看?
搬不搬砖 2007-03-31
  • 打赏
  • 举报
回复
全部代码都在这儿,


#define DLG_FILTER "txt Files (*.txt)|*.txt||"
#define DLG_EXT "txt"

CFileDialog dlg(TRUE, _T(DLG_EXT), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, _T(DLG_FILTER));

if (dlg.DoModal() == IDOK)
{
POSITION pos = dlg.GetStartPosition();

while (pos != 0)
{
CString s = dlg.GetNextPathName(pos);
}
}
菜牛 2007-03-31
  • 打赏
  • 举报
回复
我这里没发现这种现象。把你前面的代码(构造、设置dlg的代码)贴出来看看。
星羽 2007-03-31
  • 打赏
  • 举报
回复
s.Replace("\\\\", "\\");

- -!

7,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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