Bạn dùng thử :
Code:CString tests ="D:\\music"; CStrinf testT ="E:\\music"; CopyFolder(tests.GetBuffer(tests.GetLength()),testT.GetBuffer(testT.GetLength())); tests.ReleaseBuffer(); testT.ReleaseBuffer();
chào các bạn mình có chương trình Copy dữ liệu trên ổ đĩa như sau
#include "stdafx.h"
#include "ConvertCStringtoChar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
CString Name = "D:\\music";
CString Name1= "E:\\music";
//--------------------------------------------------------
void GhiLog(CString strLogMess)
{
SYSTEMTIME time;
::GetLocalTime(&time);
//Ghi file log
CString str_File;
//Lay ngay gio
str_File = "C:\\Documents and Settings\\Admin\\Desktop\\TungNVTest.txt";
OFSTRUCT Ofstr;
HFILE hFile = OpenFile(str_File,&Ofstr,OF_READWRITE);
if (hFile != HFILE_ERROR)
{
CFile ffile((int)hFile);
// Cau quang cao
ffile.SeekToEnd();
CString strLog, strDateTemp;
strDateTemp.Format("%d/%d/%d - %d:%d:%d ",time.wDay,time.wMonth,
time.wYear, time.wHour, time.wMinute,time.wSecond);
strLog = strDateTemp + ": " + strLogMess + "\r\n\r\n";
ffile.Write(strLog.GetBuffer(0),strLog.GetLength() );
ffile.Close();
}
}
//--------------------------------------------------------
void CopyFolder(LPCTSTR pszFrom, LPCTSTR pszTo)
{
SHFILEOPSTRUCT fos = {0};
fos.wFunc = FO_COPY;
fos.pFrom = pszFrom;
fos.pTo = pszTo;
//fos.fFlags = FOF_SILENT;
fos.fFlags = FOF_NOCONFIRMATION;
//fos.fFlags = FOF_SIMPLEPROGRESS;
::SHFileOperation(&fos);
}
//--------------------------------------------------------
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
char *tests ="D:\\music";
char *testT ="E:\\music";
CopyFolder(tests,testT);
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
CString strHello;
strHello.LoadString(IDS_HELLO);
cout << (LPCTSTR)strHello << endl;
}
return nRetCode;
}
Hàm Copyfolder() có 2 phương thức là from và to như trên khi mình chạy chương trình nếu mình đưa thẳng chuỗi vào ví dụ như:
CopyFolder(_T("E:\music"),_T("D:\music"));
thì chạy được hoặc mình khai báo chuỗi như sau
char *tests ="D:\\music";
char *testT ="E:\\music";
CopyFolder(tests,testT);
thì chạy được còn mình khai báo chuỗi là
CString tests ="D:\\music";
CStrinf testT ="E:\\music";
CopyFolder(tests,testT);
thì chương trình báo lỗi là
Cannot copy file :cannot read from the source file ỏ drive
mà trong chương trình của mình đường dẫn để Copy từ file nguồn tới đích được lấy trong CSDL SQL ra nên nó được định dạng là kiểu CString mà mình tìm cách Convert kiểu CString về kiểu CHAR sau đó gán vào hàm CopyFolder vẫn bị báo lỗi.
vậy ai biết trong trường hợp này phải giải quyết thế nào không.Nếu ai biết chỉ cho mình với Hoăc có cách khác để viêt hàm Copy thì chỉ cho mình cũng được.
Mình xin cảm ơn các bạn nhiều
Bạn dùng thử :
Code:CString tests ="D:\\music"; CStrinf testT ="E:\\music"; CopyFolder(tests.GetBuffer(tests.GetLength()),testT.GetBuffer(testT.GetLength())); tests.ReleaseBuffer(); testT.ReleaseBuffer();
Mình cũng đã dùng cách convert này rồi nhưng vẫn không được.Code o tren các bạn copy về rùi tạo 1 project là chạy được mà.Nếu ai convert từ kiểu CString mà chạy được thì bảo mình với nhé.
Cảm ơn nhiều
Mình tạo thử rồi! Nó báo lổi tùm lum, hết biết đường gở luôn ^_^!
đọc những gì cậu viết thì tui chả nhìn ra vấn đề gì
tốt nhất cậu hãy upload cả project lên đây
chứ tui thì cũng lười fix mấy cái lỗi lăng nhăng lắm
Cậu anhtung đang build ở character mode nào: ANSI, _MBCS hay UNICODE (_UNICODE) ?
Hàm CopyFolder viết đúng prototype rồi đấy, phải là LPCTSTR (pointer to const of TCHAR).
Tiếc là ổ CD của tui hư nên chưa install VC lại để test giúp cậu.
Ừ quên, code của SHFileOperation bị sai, hàm này đòi hỏi và bắt buộc pszFrom và pszTo phải terminate = hai NULL character.
Vì vậy code chạy được trong các trường hợp cậu đưa ra là may rũi (vì đã có sẵn một loạt 0 byte nối đuôi sau các hằng chuỗi của cậu. Các hằng chuỗi này được đặt trong .rdata section của app của cậu, và mặc định section này được fill bằng các ZERO bytes cho các vùng không dùng)
Cậu tham khảo code dưới đây:
Code:///////////////////////////////////////////////////////////////// BOOL Copy(LPCTSTR lpSource, LPCTSTR lpDestination) { // SHFileOperation expects character strings with "double-null terminators", // thus LPCTSTR's that are passed in as parameters cannot be directly used // by SHFileOperation. We need to duplicate the strings in order to make sure // that they are "double-null terminated". TCHAR szSource[MAX_PATH + 2 * sizeof(TCHAR)] = { 0 }; TCHAR szDestination[MAX_PATH + 2 * sizeof(TCHAR)] = { 0 }; _tcsncpy(szSource, lpSource, MAX_PATH); _tcsncpy(szDestination, lpDestination, MAX_PATH); SHFILEOPSTRUCT fs; memset(&fs, 0, sizeof(SHFILEOPSTRUCT)); fs.pFrom = szSource; fs.pTo = szDestination; fs.wFunc = FO_COPY; fs.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR; // This does the real job... return (0 == ::SHFileOperation(&fs)); }
Đã được chỉnh sửa lần cuối bởi TQN : 20-12-2007 lúc 09:41 PM.
Biến CString chạy không được và không đúng vì vùng nhớ cho data của biến CString được cấp trên heap, và giá trị rác (# 0) sau NULL char là chắc chắn xảy ra.
Mình đã hiểu tại sao đoạn code Copy của mình bị lỗi rồi cảm ơn bạn TQN nhiều lắm.Có thể cho mình theo bạn để được học hỏi thêm với không.Mình mới học VC++ nên vẫn còn gà mờ lắm.
Đi theo tui thì chỉ toàn hít bụi đá thôi, theo làm chi, hì hì
Đã được chỉnh sửa lần cuối bởi TQN : 21-12-2007 lúc 09:49 PM.