hur.cn - 华软网

 热门搜索

打开文件的路径问题: 在当前工程路径(E盘某个路径下)通过std::ofstream 的open函数创建一个文件, 为什么创建的文件却在其他路径下(D盘的某个路径下).详情请见正文!!!!!!!

  作者:未知    来源:网络    更新时间:2009/5/27
在工程中
有一函数
void func()
{
   ......

   std::ofstream of;
   of.open("why_not.txt");

   ......
}

本来why_not.txt文件不存在,通过次来创建.按理说应该是在当前工程路径下(在我机子上应为e盘)
但创建出来的却在d盘下

分析了下:
由于在调用此函数前通过CFileDialog 来打开另外一文件(test.db),此文件在d:test.db,
此时函数func生成的文件也为d:why_not.txt

但如果调用func之前未有操作"通过CFileDialog 来打开另外一文件(test.db),此文件在d:test.db"的话
生成的文件正好在当前工程路径下.

请问这是什么原因,不胜感激!!!



---华软 网友回答---
你不用全路径的话,函数使用的是”当前路径“来创建你的文件,而这个“当前路径”是可以被修改的
CFileDialog这个对话框就可以
---华软网友回复---
引用 1 楼 hurryboylqs 的回复:
你不用全路径的话,函数使用的是”当前路径“来创建你的文件,而这个“当前路径”是可以被修改的 
CFileDialog这个对话框就可以


我用CFileDialog是来选中另外一个文件进行某中处理.
为什么
std::ofstream of; 
of.open("why_not.txt"); 
创建的文件不在当前工程路径,反而也在之前选种的路径呢?
---华软网友回复---
上面不是给你说了么?CFileDialog为了下次再打开这个对话框时,默认的路径是上次打开的
所以它通过SetCurrentDirectory修改了这个“当前目录”
下次再调用CFileDialog时它会再调用GetCurrentDirectory
获取上次打开过的路径
而of.open("why_not.txt"); 这里它用的就是这个“当前路径”加上文件名创建出来的
---华软网友回复---
你的意思是,CFileDialog会影响ofstream流的路径?影响工作路径?
为什么不使用绝对路径呢?
---华软网友回复---
本意是想用
std::ifstream if; 
if.open("init.txt"); 
来打开当前路径下的文件init.txt

但始终是open失败,
起初怀疑是init.txt放错位置了
就通过
std::ofstream of; 
of.open("why_not.txt");生成一个文件找出正确 当前工程路径的

于是发现了
由于在调用此函数前通过CFileDialog 来打开另外一文件(test.db),此文件在d:test.db, 
此时函数func生成的文件也为d:why_not.txt 

但如果调用func之前未有操作"通过CFileDialog 来打开另外一文件(test.db),此文件在d:test.db"的话 
生成的文件正好在当前工程路径下

把放到d:init.txt下就能成功open.

1、麻烦大侠给个解释

2、如果原因真是1楼说的那样,要实现如下:
open文件init.txt获取内容需要在操作"通过CFileDialog 来打开另外一文件(test.db),此文件在d:test.db"
init.txt需要防在当前工程路径下
请问这如何实现
---华软网友回复---
引用 4 楼 biweilun 的回复:
你的意思是,CFileDialog会影响ofstream流的路径?影响工作路径? 
为什么不使用绝对路径呢?

对的,
因为
本意是想用 
std::ifstream if; 
if.open("init.txt"); 来获取内容

init.txt起一个ini文件类似的作用
---华软网友回复---
GetModuleName得到自身路径
然后SetCurrentDirectory

---华软网友回复---
引用 7 楼 biweilun 的回复:
GetModuleName得到自身路径 
然后SetCurrentDirectory 

谢谢!
---华软网友回复---
1.当调用of.open函数,若指定的文件名不是绝对路径,open函数会自动调用GetCurrentDirectory,给文件加上完整的路径。这就是为什么使用CFileDialog之后,open只能打前前面路径下的文件。
2.如要把文件放在当前工程的路径下,就必须取得工程所以的绝对路径,可以通过GetModuleFileName函数获得你的主程序的运行路径,然后滤除掉文件名,就是你的工程当前路径了,以后的文件名全部加上这个路径,就可以了。
---华软网友回复---
不要用
std::ofstream of; 
  of.open("why_not.txt"); 
这种代码创建文件
要绝对的路径,比如

std::ofstream of; 
  of.open("e:\\why_not.txt"); 
你要想在EXE当前的目录创建文件的话先GetModuleName
这个函数得到EXE的全路径
你处理下这个字符串(把exe的文件名去掉)加上why_not.txt来创建文件即可
不要动不动SetCurrentDirectory,不是个好习惯


代码
std::ofstream of; 
  of.open(GetModuleName + "why_not.txt");
---华软网友回复---
引用 7 楼 biweilun 的回复:
GetModuleName得到自身路径 
然后SetCurrentDirectory 

怎么查不到GetModuleName函数的用法?
---华软网友回复---
引用 10 楼 hurryboylqs 的回复:
不要用 
std::ofstream of; 
  of.open("why_not.txt"); 
这种代码创建文件 
要绝对的路径,比如 

std::ofstream of; 
  of.open("e:\\why_not.txt"); 
你要想在EXE当前的目录创建文件的话先GetModuleName 
这个函数得到EXE的全路径 
你处理下这个字符串(把exe的文件名去掉)加上why_not.txt来创建文件即可 
不要动不动SetCurrentDirectory,不是个好习惯 


伪代码: 
std::ofstream of; 
  of.open(GetModule…

谢谢

能否提供下GetModuleName函数的用法,找了半天没找到
---华软网友回复---
装个MSDN,在index里输入这个函数,回车就出来了
---华软网友回复---
GetModuleFileName
The GetModuleFileName function retrieves the fully qualified path for the specified module. 

To specify the process that contains the module, use the GetModuleFileNameEx function. 

DWORD GetModuleFileName(
  HMODULE hModule,    // handle to module
  LPTSTR lpFilename,  // path buffer
  DWORD nSize         // size of buffer
);
Parameters
hModule 
[in] Handle to the module whose path is being requested. If this parameter is NULL, GetModuleFileName retrieves the path for the current module. 
lpFilename 
[out] Pointer to a buffer that receives the fully-qualified path for the module. If the length of the string exceeds the size specified by the nSize parameter, the string is truncated. 
Windows NT/2000/XP: The path can have the prefix "\\?\", depending on how the module was loaded. For more information, see File Name Conventions. 

nSize 
[in] Specifies the length of the lpFilename buffer, in TCHARs. 
Return Values
If the function succeeds, the return value is the length of the string copied to the buffer, in TCHARs.

If the function fails, the return value is zero. To get extended error information, call GetLastError. 

Remarks
If a DLL is loaded in two processes, its file name in one process may differ in case from its file name in the other process. 

For the ANSI version of the function, the number of TCHARs is the number of bytes; for the Unicode version, it is the number of characters. 

Windows 95/98/Me: The GetModuleFilename function retrieves long file names when an application's version number is greater than or equal to 4.00 and the long file name is available. Otherwise, it returns only 8.3 format file names.

Windows 95/98/Me: GetModuleFileNameW is supported by the Microsoft Layer for Unicode. To use this, you must add certain files to your application, as outlined in Microsoft Layer for Unicode on Windows 95/98/Me Systems.

Requirements 
  Windows NT/2000/XP: Included in Windows NT 3.1 and later.
  Windows 95/98/Me: Included in Windows 95 and later.
  Header: Declared in Winbase.h; include Windows.h.
  Library: Use Kernel32.lib.
  Unicode: Implemented as Unicode and ANSI versions on Windows NT/2000/XP. Also supported by Microsoft Layer for Unicode.

See Also

---华软网友回复---
GetModuleFileName

DWORD WINAPI GetModuleFileName(
  __in_opt  HMODULE hModule,
  __out     LPTSTR lpFilename,
  __in      DWORD nSize
);


Parameters
hModule 
A handle to the loaded module whose path is being requested. If this parameter is NULL, GetModuleFileName retrieves the path of the executable file of the current process.

lpFilename 
A pointer to a buffer that receives the fully-qualified path of the module. If the length of the path is less than the size that the nSize parameter specifies, the function succeeds and the path is returned as a null-terminated string. 

If the length of the path exceeds the size that the nSize parameter specifies, the function succeeds and the string is truncated to nSize characters including the terminating null character.

Windows XP/2000:  The string is truncated to nSize characters and is not null terminated.
The string returned will use the same format that was specified when the module was loaded. Therefore, the path can be a long or short file name, and can use the prefix "\\?\". For more information, see Naming a File.

nSize 
The size of the lpFilename buffer, in TCHARs.

Return Value
If the function succeeds, the return value is the length of the string that is copied to the buffer, in characters, not including the terminating null character. If the buffer is too small to hold the module name, the string is truncated to nSize characters including the terminating null character, the function returns nSize, and the function sets the last error to ERROR_INSUFFICIENT_BUFFER.

---华软网友回复---
嘿嘿,原来大侠们开始的函数名弄错了,找不到
---华软网友回复---
明白啊啊      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。