一个关于的问题,在线等待中...

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

不要告诉我使用象"C:\\Program Files\\MyProgram\\Data\\aaa.txt"这样的绝对路
径,我需要在设计时考虑到用户安装文件夹的灵活性.

在线等待中................

19 个解决方案

#1


你可以选得到程序的当前路径,然后加上自已的目录名不就OK了。

#2


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

#3


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

#4


获得当前路径:
char EXEDirectory[MAX_PATH];
memset(EXEDirectory,0,MAX_PATH);
GetCurrentDirectory(MAX_PATH,EXEDirectory);

你也可以把安装的路径写在注册表里面啊。从注册表读出来就可以了。

#5


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

#6


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

#7


取文件的路径可以用
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目录也去掉

#8


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

#9


to johnic(johnic):

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

#10


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

#11


设置键值:
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;

读取类似。
不过最好再安装程序安装的时候写入键值。
然后再需要的时候再程序里面直接读。

#12


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

#13


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

#14


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

#15


去掉文件名有什么难的?
你知道文件叫什么名字啊,然后在合适的位置置为'\0'就行了。

#16


to  gandi(Gandi.NET):
可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)

to johnic(johnic) :
你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
对字符串的处理我是一窍不通啊

#17


to  gandi(Gandi.NET):
可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)

to johnic(johnic) :
你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
对字符串的处理我是一窍不通啊

#18


欢迎大家继续讨论这个问题啊
谢谢了先

#19


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

#1


你可以选得到程序的当前路径,然后加上自已的目录名不就OK了。

#2


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

#3


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

#4


获得当前路径:
char EXEDirectory[MAX_PATH];
memset(EXEDirectory,0,MAX_PATH);
GetCurrentDirectory(MAX_PATH,EXEDirectory);

你也可以把安装的路径写在注册表里面啊。从注册表读出来就可以了。

#5


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

#6


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

#7


取文件的路径可以用
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目录也去掉

#8


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

#9


to johnic(johnic):

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

#10


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

#11


设置键值:
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;

读取类似。
不过最好再安装程序安装的时候写入键值。
然后再需要的时候再程序里面直接读。

#12


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

#13


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

#14


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

#15


去掉文件名有什么难的?
你知道文件叫什么名字啊,然后在合适的位置置为'\0'就行了。

#16


to  gandi(Gandi.NET):
可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)

to johnic(johnic) :
你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
对字符串的处理我是一窍不通啊

#17


to  gandi(Gandi.NET):
可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)

to johnic(johnic) :
你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
对字符串的处理我是一窍不通啊

#18


欢迎大家继续讨论这个问题啊
谢谢了先

#19


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

#20