我写了一个基于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。
然后据此产生自己的目录。
GetModuleFileNameEx或GetModuleBaseName。
然后据此产生自己的目录。
#4
获得当前路径:
char EXEDirectory[MAX_PATH];
memset(EXEDirectory,0,MAX_PATH);
GetCurrentDirectory(MAX_PATH,EXEDirectory);
你也可以把安装的路径写在注册表里面啊。从注册表读出来就可以了。
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(...)
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目录也去掉
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(...)
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(...)
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;
读取类似。
不过最好再安装程序安装的时候写入键值。
然后再需要的时候再程序里面直接读。
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"
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'就行了。
你知道文件叫什么名字啊,然后在合适的位置置为'\0'就行了。
#16
to gandi(Gandi.NET):
可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)
to johnic(johnic) :
你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
对字符串的处理我是一窍不通啊
可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)
to johnic(johnic) :
你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
对字符串的处理我是一窍不通啊
#17
to gandi(Gandi.NET):
可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)
to johnic(johnic) :
你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
对字符串的处理我是一窍不通啊
可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)
to johnic(johnic) :
你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
对字符串的处理我是一窍不通啊
#18
欢迎大家继续讨论这个问题啊
谢谢了先
谢谢了先
#19
比如取到的路径path = "c:\test\test.exe"
赋值path[strlen(path)-8] = '\0' (test.exe长度是8)
然后path里面就是"c:\test"
赋值path[strlen(path)-8] = '\0' (test.exe长度是8)
然后path里面就是"c:\test"
#20
#1
你可以选得到程序的当前路径,然后加上自已的目录名不就OK了。
#2
to vc_boy():
请问究竟怎么样才能得到程序的当前路径?又怎么才能加上自已的目录名?能不能说的详细一点啊,给点代码也好啊
代码说明一切!!
请问究竟怎么样才能得到程序的当前路径?又怎么才能加上自已的目录名?能不能说的详细一点啊,给点代码也好啊
代码说明一切!!
#3
楼上的说的对。
GetModuleFileNameEx或GetModuleBaseName。
然后据此产生自己的目录。
GetModuleFileNameEx或GetModuleBaseName。
然后据此产生自己的目录。
#4
获得当前路径:
char EXEDirectory[MAX_PATH];
memset(EXEDirectory,0,MAX_PATH);
GetCurrentDirectory(MAX_PATH,EXEDirectory);
你也可以把安装的路径写在注册表里面啊。从注册表读出来就可以了。
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(...)
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目录也去掉
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(...)
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(...)
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;
读取类似。
不过最好再安装程序安装的时候写入键值。
然后再需要的时候再程序里面直接读。
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"
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'就行了。
你知道文件叫什么名字啊,然后在合适的位置置为'\0'就行了。
#16
to gandi(Gandi.NET):
可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)
to johnic(johnic) :
你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
对字符串的处理我是一窍不通啊
可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)
to johnic(johnic) :
你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
对字符串的处理我是一窍不通啊
#17
to gandi(Gandi.NET):
可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)
to johnic(johnic) :
你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
对字符串的处理我是一窍不通啊
可能你不知道啊,我要求我的程序不光是能读写data目录中的数据文件,还要它能够读写用户硬盘上所有相同格式的文件,正是如此才产生了上述问题:)
to johnic(johnic) :
你好,能不能说的详细一点啊,究竟有那些API专门用来处理字串?能部能给些提示代码?
对字符串的处理我是一窍不通啊
#18
欢迎大家继续讨论这个问题啊
谢谢了先
谢谢了先
#19
比如取到的路径path = "c:\test\test.exe"
赋值path[strlen(path)-8] = '\0' (test.exe长度是8)
然后path里面就是"c:\test"
赋值path[strlen(path)-8] = '\0' (test.exe长度是8)
然后path里面就是"c:\test"