這是我的批量改檔案名的部分代碼,在我的VS2010上沒有實作想要的功能。
void CremarksecretDlg::OnCbnSelchangeCombo()
{
// TODO: 在此添加控制元件通知處理程式代碼
}
CString CremarksecretDlg::GetSecurityLevel()
{
CString cmbName;
mComeboBox.GetWindowText(cmbName);//"1: 公開";
int at=cmbName.ReverseFind(' ');
return cmbName.Right(cmbName.GetLength()-at-1);
}
void CremarksecretDlg::OnBnClickedButton4()
{
// TODO: 在此添加控制元件通知處理程式代碼
CString sl=GetSecurityLevel();
POSITION pos = mlist.GetFirstSelectedItemPosition();
int nSelectedItem = -1;
while (pos!=NULL)
{
nSelectedItem = mlist.GetNextSelectedItem(pos);
CString name = mlist.GetItemText(nSelectedItem,1);
CString path = mlist.GetItemText(nSelectedItem,3);
CString extname=name.Right(name.GetLength()-name.ReverseFind('.'));
CString pureName=name.Left(name.ReverseFind('.'));
CString newName=path;
newName += "\\";
newName += pureName;
newName += sl;// "機密";// 增加的
newName += extname;
AfxMessageBox(path + "\\"+ name + " To " + newName);
// CFile::Rename(path + "\\"+ name, newName );
}
}
void CremarksecretDlg::OnCbnSelchangeCombo()這里什么都不用寫嗎?
// CFile::Rename(path + "\\"+ name, newName );到底要不要?我不想要檔案的路徑和"\\"這里可以改成CFile::Rename( name, newName );嗎?請明白的高手指點。
uj5u.com熱心網友回復:
好壓軟體似乎自帶批處理改名功能。uj5u.com熱心網友回復:
可是我得自己編一個批量命名的程式啊,目的是改名,就是讓檔案名后面可以添加(公開)、(內部)、(秘密)等,請高手幫忙啊。如:XXX(內部).pdf。uj5u.com熱心網友回復:
請高手幫忙看一下,多謝。uj5u.com熱心網友回復:
“void CremarksecretDlg::OnCbnSelchangeCombo()這里什么都不用寫嗎?”對 !
“// CFile::Rename(path + "\\"+ name, newName );到底要不要?我不想要檔案的路徑和"\\"這里可以改成CFile::Rename( name, newName );嗎?請明白的高手指點。”
不行 ,因為 findfile 出來的 可能是 不同的 路徑 !
bewName 已帶路徑,
Rename 必須要 路徑 ,否則是 當前 目錄
uj5u.com熱心網友回復:

我想要遍歷出來的檔案名如上圖所示,檔案名標密成XXX(公開).pdf,其他以此類推,檔案名這里不要顯示路徑,就是單純的檔案名,我有個例程,它的顯示就是不帶路徑名的純檔案名,您看如何編能不在檔案名這里顯示路徑,多謝了。
uj5u.com熱心網友回復:

我的程式編譯的時候報錯了,不知道是怎么回事,請您看看吧。
uj5u.com熱心網友回復:
編譯的錯誤解決了,不好意思,讓您費心了。uj5u.com熱心網友回復:
"它的顯示就是不帶路徑名的純檔案名"
list 不要 顯示 “路徑” 這一列
這樣 你 檔案 只能 在 一個 目錄 下 !
uj5u.com熱心網友回復:
那我想保留路徑名,只對檔案名這一列的檔案進行改名呢?這該怎么編程呢?uj5u.com熱心網友回復:
“只對檔案名這一列的檔案進行改名呢“洗掉 所有 使用 path 的 地方,即
CString name = m_list.GetItemText(nSelectedItem,1);
// CString path = m_list.GetItemText(nSelectedItem,3);
uj5u.com熱心網友回復:
void CremarksecretDlg::OnBnClickedButton4()
{
// TODO: 在此添加控制元件通知處理程式代碼
// TODO: Add your control notification handler code here
CString sl=GetSecurityLevel();
CString newName;
POSITION pos = mlist.GetFirstSelectedItemPosition();
int nSelectedItem = -1;
while (pos != NULL)
{
nSelectedItem = mlist.GetNextSelectedItem(pos);
CString name = mlist.GetItemText(nSelectedItem,1); //自注:這里的name下面用到了
//CString path = mlist.GetItemText(nSelectedItem,3); //自注:不要path這一列
CString extname=name.Right(name.GetLength()-name.ReverseFind('.')); //自注:排除'.'前面所有字,剩下的就是例如.pdf,.doc之類的字符了。
CString pureName=name.Left(name.ReverseFind('.')); //自注:要'.'左邊的字
// CString newName=path;//
// newName += "\\"; //
newName += pureName;
newName += sl; // "機密";// 增加的
newName += extname;
// AfxMessageBox(path +"\\"+ name+ " To " + newName);//
//CFile::Rename(name,newName );
name=newName;
}
我按我的意圖,改了重命名按鈕的程式內容,如上所示,但是編譯成功后,點重命名按鈕,改名的操作無效,請指點。
uj5u.com熱心網友回復:
AfxMessageBox(name+ " To " + newName);//CFile::Rename(name,newName );
// name=newName;
要看 目錄里 有沒有 改名。與 // name=newName; 無關
uj5u.com熱心網友回復:
void CremarksecretDlg::OnBnClickedButton4()
{
// TODO: 在此添加控制元件通知處理程式代碼
// TODO: Add your control notification handler code here
CString sl=GetSecurityLevel();
CString newName;
POSITION pos = mlist.GetFirstSelectedItemPosition();
int nSelectedItem = -1;
while (pos != NULL)
{
nSelectedItem = mlist.GetNextSelectedItem(pos);
CString name = mlist.GetItemText(nSelectedItem,1); //自注:這里的name下面用到了
//CString path = mlist.GetItemText(nSelectedItem,3); //自注:不要path這一列
CString extname=name.Right(name.GetLength()-name.ReverseFind('.')); //自注:排除'.'前面所有字,剩下的就是例如.pdf,.doc之類的字符了。
CString pureName=name.Left(name.ReverseFind('.')); //自注:要'.'左邊的字
// CString newName=path;//
// newName += "\\"; //
newName += pureName;
newName += sl; // "機密";// 增加的
newName += extname;
AfxMessageBox(name+" To "+ newName);//
//AfxMessageBox(path +"\\"+ name+ " To " + newName);//
CFile::Rename(name,newName );
// name=newName;
}
}
像您說的,我改了,可是點擊“重命名”按鈕,檔案名沒有變化。
uj5u.com熱心網友回復:

改名 cmd一個ren即可
C:\Users\x>ren /?
重命名檔案。
RENAME [drive:][path]filename1 filename2.
REN [drive:][path]filename1 filename2.
請注意,你不能為目標檔案指定新的驅動器或路徑。
你用system或WinExec 就能改名了啊
uj5u.com熱心網友回復:
我不是要改檔案名的方法,我是自己編批量改檔案名的程式,我要的是如何實作功能的代碼,請注意。uj5u.com熱心網友回復:

這是我的點擊“重命名”按鈕后,程式跳出來的錯誤提示,請問怎么辦,是什么原因造成的?
uj5u.com熱心網友回復:
CFile::Renamestatic void PASCAL Rename( LPCTSTR lpszOldName, LPCTSTR lpszNewName );
throw( CFileException );
Parameters
lpszOldName
The old path.
lpszNewName
The new path.
Remarks
This static function renames the specified file. Directories cannot be renamed. This is equivalent to the REN command.
uj5u.com熱心網友回復:
不明白 你 為什么 不要 路徑uj5u.com熱心網友回復:
因為路徑在我的最上面的圖上顯示了,它在CListCtrl控制元件中的最右邊一列,我想用重命名按鈕對在檔案名那一列的檔案名改名,所以我才不要路徑,因為我只想對檔案名操作,不想摻雜別的內容,請問怎么實作,多謝。uj5u.com熱心網友回復:
檔案 總 是 有 路徑 的 !“只想對檔案名操作“ 不可能 , 而且 你 也 沒有 修改 路徑
uj5u.com熱心網友回復:
好像樓主已經解決了
uj5u.com熱心網友回復:
新手看不懂,著呢麼辦,求師傅uj5u.com熱心網友回復:
把系統的檔案系統比作 樹, 那么 路徑就是 樹上的支 , 檔案名就是 葉 。uj5u.com熱心網友回復:
應該還是比較簡單的uj5u.com熱心網友回復:
我想只對檔案名改名,不一定非得跟路徑打交道吧,我想檔案名是檔案名,路徑是路徑,兩不相干不行嗎?或者是動檔案名也要動路徑,那最后還是落實到檔案名的變化上,路徑只是借用一下嗎?uj5u.com熱心網友回復:
“我想檔案名是檔案名,路徑是路徑,兩不相干不行嗎”問題 是 作業系統 認 不認 !
uj5u.com熱心網友回復:
"或者是動檔案名也要用到路徑,那最后還是落實到檔案名的變化上,路徑只是借用一下嗎?"對 路徑是檔案的一部分 ,就想 到 你家 (檔案名),沒有地址 (路徑)可不行
uj5u.com熱心網友回復:
MoveFile
The MoveFile function renames an existing file or a directory (including all its children).
BOOL MoveFile(
LPCTSTR lpExistingFileName, // pointer to the name of the existing file
LPCTSTR lpNewFileName // pointer to the new name for the file
);
Parameters
lpExistingFileName
Pointer to a null-terminated string that names an existing file or directory.
lpNewFileName
Pointer to a null-terminated string that specifies the new name of a file or directory. The new name must not already exist. A new file may be on a different file system or drive. A new directory must be on the same drive.
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
Remarks
The MoveFile function will move (rename) either a file or a directory (including all its children) either in the same directory or across directories. The one caveat is that the MoveFile function will fail on directory moves when the destination is on a different volume.
uj5u.com熱心網友回復:

我想要標密的檔案像這樣,標上密級,我不知道是怎么實作的。我有一個如上這樣的一個別人的例程,但是現在我想自己編,但是我不知道人家的程式對檔案名重命名是如何實作的,有明白的請指點。
uj5u.com熱心網友回復:
1 檔案名 改了 沒有 ? 進入 “計算機” (explorer.exe)找 到 加密后 的 檔案 名 。2 你的那個 list 里 是 原 檔案 名 , 要 重新 “find” 一次,獲取 改后的 檔案名 。
uj5u.com熱心網友回復:
// Rename
void CShowdirDlg::OnButton4()
{
// TODO: Add your control notification handler code here
CString sl=GetSecurityLevel();
POSITION pos = m_list.GetFirstSelectedItemPosition();
int nSelectedItem = -1;
while (pos != NULL)
{
nSelectedItem = m_list.GetNextSelectedItem(pos);
CString name = m_list.GetItemText(nSelectedItem,1);
CString path = m_list.GetItemText(nSelectedItem,3);
CString extname=name.Right(name.GetLength()-name.ReverseFind('.'));
CString pureName=name.Left(name.ReverseFind('.'));
CString newName=path;
newName += "\\";
newName += pureName;
newName += sl;// "機密";
newName += extname;
AfxMessageBox(path + "\\"+ name + " To " + newName);
CFile::Rename(path + "\\"+ name, newName );
}
}
沒問題的 !
uj5u.com熱心網友回復:
有 2個 特殊 路徑 即 當前目錄 .\ 和 父目錄 ..\uj5u.com熱心網友回復:
CString CremarksecretDlg::GetSecurityLevel() //自注:得到的密級
{
CString cmbName;
mCombobox.GetWindowText(cmbName);//"1: 公開";
int at=cmbName.ReverseFind(' ');
return cmbName.Right(cmbName.GetLength()-at-1);
}
void CremarksecretDlg::OnBnClickedButton4()
{
// TODO: 在此添加控制元件通知處理程式代碼
// TODO: Add your control notification handler code here
CString sl=GetSecurityLevel(); //自注:回傳得到的密級
CString newName;
POSITION pos = mlist.GetFirstSelectedItemPosition();
int nSelectedItem = -1;
while (pos != NULL)
{
nSelectedItem = mlist.GetNextSelectedItem(pos);
CString name = mlist.GetItemText(nSelectedItem,1); //自注:這里的name下面用到了
CString path = mlist.GetItemText(nSelectedItem,3); //自注:不要path這一列
CString extname=name.Right(name.GetLength()-name.ReverseFind('.')); //自注:排除'.'前面所有字,剩下的就是例如.pdf,.doc之類的字符了。
CString pureName=name.Left(name.ReverseFind('.')); //自注:要'.'左邊的字
CString newName=path;//
newName += "\\"; //
newName += pureName;
newName += sl; // "機密";// 增加的
newName += extname;
// AfxMessageBox(name+" To "+ newName);//
AfxMessageBox(path +"\\"+ name+ " To " + newName);//
CFile::Rename(path+"\\"+name,newName );
// name=newName;
}
}
得到密級的函式這樣寫就行了,不少什么東西嗎?怎么我按這樣寫了,怎么生成的exe程式,操作后報錯呢?說什么錯誤的路徑。
uj5u.com熱心網友回復:
同時 改 list 中的 name 可以CFile::Rename(path + "\\"+ name, newName );
// change list name
CString lstNewName=newName.Right(newName.GetLength()-newName.ReverseFind('\\')-1);
m_list.SetItemText(nSelectedItem,1,lstNewName);
uj5u.com熱心網友回復:
AfxMessageBox(path + "\\"+ name + " To " + newName);就是除錯 用 的 , 你看看 有沒有問題
uj5u.com熱心網友回復:


按您的指點改了,但是選擇了串列組合框的密級后,點擊“重命名”按鈕,出現了上面的錯誤提示,點擊重命名出現了第一個圖示的錯誤,再點擊出現第二個圖示的錯誤。
uj5u.com熱心網友回復:
1 檔案名 里 有 引號 ? “秘密” , 不要用 “” ,用 ()2 Rename 按鈕 只能 點 一次 (原檔案 已不再 存在)
3 目錄 這么 長 ? (超過 260 MAXPATH)又帶 空格 又帶 標點 ? 胡亂 起的 名 ?
uj5u.com熱心網友回復:
1 圖1 檔案名 提示 不 對 ! 仔細檢查 !uj5u.com熱心網友回復:

這個例程,不是我的程式,是一個成品程式,我就是模仿這個程式在編我自己的程式,他這個程式,就是點擊“重命名”后使遍歷后檔案的檔案名,都加上了(內部)密級,而不是引號“ ”。如果需要的話我可以把這個成品程式發給你,你幫我看看好嗎?多謝。
uj5u.com熱心網友回復:
1 檔案名 里 有 引號 ? “秘密” , 不要用 “” ,用 ()combo 中 改為 1 (秘密)
uj5u.com熱心網友回復:

rename后 保留選擇項的 界面
另外 你缺的 是 Undo 功能,即 取消 上次 改名,再改回原名 !
uj5u.com熱心網友回復:
可是我的檔案名有很多都是有引號的也沒問題啊,我Combo中已經將密級改成如下代碼
mCombobox.AddString(_T("1: (公開)"));
mCombobox.AddString(_T("2: (內部)"));
mCombobox.AddString(_T("3: (秘密)"));
mCombobox.AddString(_T("4: (機密)"));
mCombobox.AddString(_T("5: (絕密)"));
但還是跟上面錯誤差不多的錯,這是怎么回事,請指教。
uj5u.com熱心網友回復:
"1: (公開)"1 用 英文 空格 和 ()
2. 最后 的 空格 不能 要
因為
int at=cmbName.ReverseFind(' ');
是 英文 空格 , 反向 找 空格 , 最后 不能有空格 !
多看看 程式, 要 自己 理解 !
uj5u.com熱心網友回復:
我照您的辦法改了,還是像原來一樣報錯。您看能不能把您的程式發給我看看,我的郵箱[email protected],多謝了。uj5u.com熱心網友回復:
已發送 showdir.raruj5u.com熱心網友回復:
我的標密程式操作后,只能在生成的exe程式中顯示標好了密級的檔案,但是到真正的目錄下看并沒有在后面標上密級,請問怎么辦,哪里出了問題?uj5u.com熱心網友回復:
newName += extname;// AfxMessageBox(path + "\\"+ name + " To " + newName);
// CFile::Rename(path + "\\"+ name, newName );
// change list name
CString lstNewName=newName.Right(newName.GetLength()-newName.ReverseFind('\\')-1);
為了 方便 除錯時 我把 紅色的 2句 給 // 掉了
去掉 // 就可以 了 , 但不能 2次 rename !
CFile::Rename(path + "\\"+ name, newName );
uj5u.com熱心網友回復:
如果 已經有 CFile::Rename(path + "\\"+ name, newName );那就是 你的 path 其實 是 錯誤的 ! 仔細檢查 !
“只能在生成的exe程式中顯示標好了密級的檔案”
list 只 改name 并沒有 動 path, 可能 find 中 給的 path 不對, 或者 fillList 時 填充的不對 !
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/60998.html
標籤:基礎類
