rename错误

baoyz 2015-02-22 11:35:36
近日做了个程序,文件重命名,同样的程序在两个自定义类里,一个能重命名一个不行。程序如下:
这个是能用的。

#include "stdio.h"
//在一个线程里
for (i = 0; i < listMm->GetItemCount() && bStartMm; i++)
{
listMm->EnsureVisible(i, TRUE);
if (listMm->GetItemText(i, 1) == "→")
{
if (!rename((LPSTR)(LPCSTR)listMm->GetItemText(i, 0), (LPSTR)(LPCSTR)listMm->GetItemText(i, 2)))
{
listMm->SetItemText(i, 1, "ok");
}
else
{
listMm->SetItemText(i, 1, strTmp);
}
}
ProgMm->SetPos(i);//这是个进度条,没用
strTmp.Format("%d/%d", i+1, listMm->GetItemCount());//这两句是提示,没用
sOut->SetWindowText(strTmp);
}

下面这段不能用

#include "stdio.h"
//在一个线程里
try
{
for (i = 0; i < listFileFix->GetItemCount() && bFF_Start; i++)
{
listFileFix->EnsureVisible(i, TRUE);
if (listFileFix->GetItemText(i, 2) == "→")
{
if (!rename((LPSTR)(LPCSTR)listFileFix->GetItemText(i, 1), (LPSTR)(LPCSTR)listFileFix->GetItemText(i, 3)))
{
listFileFix->SetItemText(i, 2, "ok");
}
else
{
listFileFix->SetItemText(i, 2, "err");
}
}
}
}
catch (...)
{
}

用GetLastError(),知道下一段程序报错是32,可是没找到对应的错误说明。又换用

try
{
CFile::Rename(listFileFix->GetItemText(i, 1), listFileFix->GetItemText(i, 3));
}
catch(CFileException* pEx )
{
TRACE(_T("File %20s not found, cause = %d\n"), pOldName,
pEx->m_cause);
pEx->Delete();
}

再查pEx->m_cause报错是EAGAIN No more processes or not enough memory or maximum nesting level reached 11
经过反复测试发现同一个目录下的文件如果用上一段程序反复重命名可以成功。一旦用下一段失败后,上一段程序也不能在同一路径用了。但是如果换一个路径,上一段程序还能用。
...全文
483 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
baoyz 2015-03-10
  • 打赏
  • 举报
回复
引用 1 楼 Future_vc 的回复:
上面三段程序都试过了,都可以重命名,可能是在执行前干过什么事造成的。比如文件不存在或已经改名,或者文件打开时也改不了名字。
找了半天在搜索文件时把文件打开了检测文件正确性,完了,忘了关了。再改名就失败了。
赵4老师 2015-02-26
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
worldy 2015-02-23
  • 打赏
  • 举报
回复
引用 楼主 baoyz 的回复:
近日做了个程序,文件重命名,同样的程序在两个自定义类里,一个能重命名一个不行。程序如下: 这个是能用的。

#include "stdio.h"
//在一个线程里
for (i = 0; i < listMm->GetItemCount() && bStartMm; i++)
		{
			listMm->EnsureVisible(i, TRUE); 
			if (listMm->GetItemText(i, 1) == "→")
			{
				if (!rename((LPSTR)(LPCSTR)listMm->GetItemText(i, 0), (LPSTR)(LPCSTR)listMm->GetItemText(i, 2)))
				{
					listMm->SetItemText(i, 1, "ok");
				}
				else
				{
					listMm->SetItemText(i, 1, strTmp);
				}
			} 
			ProgMm->SetPos(i);//这是个进度条,没用
			strTmp.Format("%d/%d", i+1, listMm->GetItemCount());//这两句是提示,没用
			sOut->SetWindowText(strTmp);
		}
下面这段不能用

#include "stdio.h"
//在一个线程里
try
	{
		for (i = 0; i < listFileFix->GetItemCount() && bFF_Start; i++)
		{
			listFileFix->EnsureVisible(i, TRUE); 
			if (listFileFix->GetItemText(i, 2) == "→")
			{
				if (!rename((LPSTR)(LPCSTR)listFileFix->GetItemText(i, 1), (LPSTR)(LPCSTR)listFileFix->GetItemText(i, 3)))
				{
					listFileFix->SetItemText(i, 2, "ok");
				}
				else
				{
					listFileFix->SetItemText(i, 2, "err");
				}
			} 
		}
	}
	catch (...)
	{
	}
用GetLastError(),知道下一段程序报错是32,可是没找到对应的错误说明。又换用

try
{
CFile::Rename(listFileFix->GetItemText(i, 1), listFileFix->GetItemText(i, 3));
}
catch(CFileException* pEx )
{
    TRACE(_T("File %20s not found, cause = %d\n"), pOldName, 
       pEx->m_cause);
    pEx->Delete();
}
再查pEx->m_cause报错是EAGAIN No more processes or not enough memory or maximum nesting level reached 11 经过反复测试发现同一个目录下的文件如果用上一段程序反复重命名可以成功。一旦用下一段失败后,上一段程序也不能在同一路径用了。但是如果换一个路径,上一段程序还能用。
使用多线程必须使用同步机制
Future_vc 2015-02-23
  • 打赏
  • 举报
回复
上面三段程序都试过了,都可以重命名,可能是在执行前干过什么事造成的。比如文件不存在或已经改名,或者文件打开时也改不了名字。
oyljerry 2015-02-23
  • 打赏
  • 举报
回复
多线程有问题了,造成对象访问不对等
另外不要在线程中直接访问mfc UI对象
oyljerry 2015-02-23
  • 打赏
  • 举报
回复
多线程有问题了,造成对象访问不对等
另外不要在线程中直接访问mfc UI对象

16,472

社区成员

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

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

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