我遇到的问题是这样的:
我写了一个基于SDI的关于文档读写的程序,我把该程序需要的一些数据文档全部放在了我自建的DATA文件夹中(注:DATA文件夹和Debug文件夹并列),并且我在程序VIEW类的一些函数调用中使用了相对路径,例如pDoc->OnOpenDocument("data\\aaa.txt");等等,也就是说这些调用的前提是:程序当前DIR为工程目录,否则就会出错!错误是程序弹出消息窗口"data\aaa.txt中包含无效的路径",请问我该怎么样设置这些DIR才能确保程序万无一失?不要告诉我使用象"C:\\Program Files\\MyProgram\\Data\\aaa.txt"这样的绝对路
径,我需要在设计时考虑到用户安装文件夹的灵活性.在线等待中................

解决方案 »

  1.   

    to vc_boy():
     
    请问究竟怎么样才能得到程序的当前路径?又怎么才能加上自已的目录名?能不能说的详细一点啊,给点代码也好啊
    代码说明一切!!
      

  2.   

    楼上的说的对。
    GetModuleFileNameEx或GetModuleBaseName。
    然后据此产生自己的目录。
      

  3.   

    获得当前路径:
    char EXEDirectory[MAX_PATH];
    memset(EXEDirectory,0,MAX_PATH);
    GetCurrentDirectory(MAX_PATH,EXEDirectory);你也可以把安装的路径写在注册表里面啊。从注册表读出来就可以了。
      

  4.   

    獲取你當前進程所在的目錄GetCurrentDirectory()然後進行你的處理.
    不能指定你的為固定目錄麼??
      

  5.   

    DWORD GetModuleFileName(
      HMODULE hModule,    // handle to module to find filename for
      LPTSTR lpFilename,  // pointer to buffer to receive module path
      DWORD nSize         // size of buffer, in characters
    );
     
    这取得的文件名是全路径, 如:c:\test\test.exe分析取c:\test即可取得目录.也可以
    GetCurrentDirectory(...)
      

  6.   

    取文件的路径可以用
    GetModuleFileName函数,取出后去掉文件名即可。举个例子:
    char m_FilePath[255]
    CString m_strTargetPath;GetModuleFileName(NULL,m_FilePath,255);//
    ...去掉文件名
    //m_strTargetPath.format("%s\\data",m_FilePath); <<m_strTargetPath中即为你需要的路径如何去掉文件名我想就不用我写了吧 :)要注意一点:如果你是在VC环境下运行,VC会将EXE文件生成到Debug或Release目录中,这样在取路径时会带上这两个目录(其中之一),如果你想模拟真实环境的话第一可以将Data目录建立Debug或release目录下。
    第二可以在去掉文件名的同时将Debug或release目录也去掉
      

  7.   

    DWORD GetModuleFileName(
      HMODULE hModule,    // handle to module to find filename for
      LPTSTR lpFilename,  // pointer to buffer to receive module path
      DWORD nSize         // size of buffer, in characters
    );
     
    这取得的文件名是全路径, 如:c:\test\test.exe分析取c:\test即可取得目录.也可以
    GetCurrentDirectory(...)
      

  8.   

    to johnic(johnic):如果能 把安装的路径写在注册表里那当然更好了
    就是不知道怎么来实现啊
    说详细一点啊!
    :)我在此谢谢各位了先
      

  9.   

    DWORD GetModuleFileName(
      HMODULE hModule,    // handle to module to find filename for
      LPTSTR lpFilename,  // pointer to buffer to receive module path
      DWORD nSize         // size of buffer, in characters
    );
     
    这取得的文件名是全路径, 如:c:\test\test.exe分析取c:\test即可取得目录.也可以
    GetCurrentDirectory(...)
      

  10.   

    设置键值:
    HKEY hKEY; 
    char data_Set[] = "AppDir"; //要设置的键值
    char Key[] = "路径"
    long ret;
    DWORD Regtype=REG_SZ; 
    ret=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_WRITE, &hKEY)); 
    if(ret!=ERROR_SUCCESS) 

    return 1;  
    } ret=::RegSetValueEx(hKEY, Key, NULL,Regtype,
    (const unsigned char *)KeyVal,strlen(KeyVal)); 
    if(ret!=ERROR_SUCCESS) 

    return 1; 

    ::RegCloseKey(hKEY);
    return 0;读取类似。
    不过最好再安装程序安装的时候写入键值。
    然后再需要的时候再程序里面直接读。
      

  11.   

    不好意思,上面有点错误。
    data_set应该是注册表里面的路径,比如"Software\\YourApp"
    Key是要设置的键值。比如“AppDir”
    KeyVal是写入的值。比如"c:\\program files\\yourapp"
      

  12.   

    to vc_boy:
    如何去掉文件名呢?请教各位了
      

  13.   

    楼主,我觉得你完全可以使用相对路径,因为从你的描述看你的data文件夹和exe可执行程序在同一目录.pDoc->OnOpenDocument("data\\aaa.txt");没问题的,做成realease版也可以的!
      

  14.   

    to  gandi(Gandi.NET):
    可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)to johnic(johnic) :
    你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
    对字符串的处理我是一窍不通啊
      

  15.   

    to  gandi(Gandi.NET):
    可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)to johnic(johnic) :
    你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
    对字符串的处理我是一窍不通啊
      

  16.   

    比如取到的路径path = "c:\test\test.exe"
    赋值path[strlen(path)-8] = '\0'  (test.exe长度是8)
    然后path里面就是"c:\test"