Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Hỏi về lỗi trong phương thức Copy của VC++

  1. #1
    Ngày gia nhập
    10 2007
    Bài viết
    15

    Mặc định Hỏi về lỗi trong phương thức Copy của VC++

    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

  2. #2
    Ngày gia nhập
    10 2007
    Bài viết
    169

    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();

  3. #3
    Ngày gia nhập
    10 2007
    Bài viết
    15

    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

  4. #4
    Ngày gia nhập
    10 2007
    Bài viết
    169

    Mình tạo thử rồi! Nó báo lổi tùm lum, hết biết đường gở luôn ^_^!

  5. #5
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    đọ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

  6. #6
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Mặc định Hỏi về lỗi trong phương thức Copy của VC++

    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.

  7. #7
    Ngày gia nhập
    09 2006
    Bài viết
    711

    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.

  8. #8
    Ngày gia nhập
    10 2007
    Bài viết
    15

    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.

  9. #9
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Đ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.

Các đề tài tương tự

  1. thắc mắc về copy file và kiểm tra tiến trình copy
    Gửi bởi RoboWonder trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 13
    Bài viết cuối: 27-03-2016, 07:15 PM
  2. ADO.NET Hàm Copy file trong c#,copy thiếu dữ liệu
    Gửi bởi gatrongpro trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 08-12-2013, 09:40 PM
  3. [Hỏi] Copy thiếu khi copy nhiều file
    Gửi bởi toi_loi_acon trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 10-07-2012, 11:02 AM
  4. Firefox Lỗi: Phải nhấn Ctrl+C hoặc Copy 2 lần mới copy được văn bản.
    Gửi bởi Kevin Hoang trong diễn đàn Thắc mắc chung
    Trả lời: 3
    Bài viết cuối: 17-01-2011, 11:17 PM
  5. Lập trình C Deep Copy - Shallow Copy
    Gửi bởi ooDKNYoo trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 25
    Bài viết cuối: 28-05-2010, 03:59 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn