使用CreateFile创建的文件位置很奇怪

秋兔子 2009-05-17 04:42:28
我在使用CreateFile创建文件是成功的,但位置很奇怪(写的是JAVA的词法分析器)

我使用了两种方式运行程序

1、命令行传入参数 c:\...........\Lex.exe Banker.java
生成的scanner_output.txt在Lex.exe所在当前目录
2、拖拽方式(将文件Banker.java拉到Lex.exe的图标上)
生成的文件scanner_output.txt没看到,后来搜索了一下竟然在C:\Documents and Settings\hp这个目录下找到
(无论我把Lex.exe复制到那个文件夹下都是这样)


我的期望结果:生成文件在当前程序Lex.exe所在文件夹下,这样用户可以直接看到

尝试:
将CreateFile("scanner_output.txt",..........)改为
CreateFile(".\\scanner_output.txt",.........)但无济于事:

涉及到的代码如下:

int main(int argc,TCHAR* argv[])
{
//若参数个数不对,报错退出
if(argc!=2)
{
printf("需要一个参数!\n");
getchar();
return -1;
}
// 创建属性流目标文件
htar = CreateFile("scanner_output.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

......

开发平台:VC6企业版

麻烦大家了,谢谢!

...全文
851 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋兔子 2009-05-17
  • 打赏
  • 举报
回复
是啊,主要是自己没有编程狂人们那么大的热情啊,早该自己多看看这方面的书了:)
谢谢你哈,好耐心~~ O(∩_∩)O
秋兔子 2009-05-17
  • 打赏
  • 举报
回复 1
非常感谢!这正是我想知道的!真是麻烦您了!

我还有一个问题在百度上问了,答案也是比较受益的,在这里贴出来吧!

answer:尽量避免使用相对路径, 相对路径是从运行时的“当前”路径开始的, 从图形界面运行起来的程序的当前路径就是在文档那里
「已注销」 2009-05-17
  • 打赏
  • 举报
回复
楼主基本功是个问题啊。
加油!
ltc_mouse 2009-05-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cherayliu 的回复:]
试了一下,wchar_t好像有问题,cannot convert parameter 2 from 'unsigned short [260]' to 'char *'

wchar_t 是 unsigned short 型的吧!

运行不成功
[/Quote]
wchar_t是用来表示unicode字符的,也即“宽字符”。Windows API都有两个版本,多字节的和unicode的。比如GetModuleFileName会根据项目配置选择GetModuleFileNameA或者GetModuleFileNameW。从出错来看,你的project是配置成多字节的,因而应使用char~

应该考虑使用5楼的做法,TCHAR,它自动根据项目配置选择char还是wchar_t,省去移植的麻烦...
_tcsrchr是TCHAR版本的strrchr(这个函数应该知道吧,就是从后往前查找某个字符,返回找到的第一个位置),用在这里是从全路径的文件名中获得对应的路径
秋兔子 2009-05-17
  • 打赏
  • 举报
回复
试了一下,wchar_t好像有问题,cannot convert parameter 2 from 'unsigned short [260]' to 'char *'

wchar_t 是 unsigned short 型的吧!

运行不成功
秋兔子 2009-05-17
  • 打赏
  • 举报
回复
哦!然后再用一次SetCurrentDirectory就行了是吗?
「已注销」 2009-05-17
  • 打赏
  • 举报
回复
wchar_t path[MAX_PATH];
GetModuleFileName(NULL, path, MAX_PATH);

关键是这两句!
这样,path中的内容就是可执行文件的完整路径,你把最后的文件名去掉就可以了。
秋兔子 2009-05-17
  • 打赏
  • 举报
回复
还要用到泛型啊?惭愧惭愧,开C++课的时候服务奥运篮球测试赛去了,没学好啊。。哭。。。。

我用的是C,混着c++好像也不太好吧。。汗。。有简单点的方法吗?
「已注销」 2009-05-17
  • 打赏
  • 举报
回复
你看我获取exe文件所在路径的方法:
shared_ptr<wstring> getAppPath()
{
wchar_t path[MAX_PATH];
GetModuleFileName(NULL, path, _countof(path));
PathRemoveFileSpec(path);

return shared_ptr<wstring>(new wstring(path));
}
秋兔子 2009-05-17
  • 打赏
  • 举报
回复
谢谢关注!
楼下说用GetModulePath
您这里用的是GetModuleFileName
请问有区别吗(GetModulePath 在 MSDN 上查不到)

您的意思应该是获取当前目录,在设置当前目录吧,这么说没有默认设置,必须根据.exe的实际位置动态获取才行对吧


TCHAR* t = _tcsrchr(szAppDir, TEXT('\\'));
*t = 0;
是什么意思呢?劳烦您给小妹讲解一下,谢谢O(∩_∩)O!!
秋兔子 2009-05-17
  • 打赏
  • 举报
回复
谢谢关注!:)
就是说CreateFile用于写文件是必须用绝对路径而不能用相对路径是吗?
但是为什么命令行却可以呢?
秋兔子 2009-05-17
  • 打赏
  • 举报
回复
谢谢!
不过我的源代码并没有指定任何目录啊?
而且当前目录怎么可能不存在呢?
还有我用的是C,C++不太清楚啊
「已注销」 2009-05-17
  • 打赏
  • 举报
回复
你应当指定绝对路径。
你可以获取exe文件所在路径。
GetModulePath
秋兔子 2009-05-17
  • 打赏
  • 举报
回复
我想问的是默认不是当前目录吗?不然第一种方式为什么对呢?
再设置一次有意义吗?
上面两种运行方式又有什么差别呢?
星羽 2009-05-17
  • 打赏
  • 举报
回复

#include "windows.h"
#include "tchar.h"

....

TCHAR szAppDir[MAX_PATH];
GetModuleFileName(GetModuleHandle(NULL), szAppDir, sizeof(szAppDir));
TCHAR* t = _tcsrchr(szAppDir, TEXT('\\'));
*t = 0;
SetCurrentDirectory(szAppDir);
....

zhaohongbo83 2009-05-17
  • 打赏
  • 举报
回复
CreateFile()是在你指定的目录下存在才能创建文件的;

在你CreateFile()之前要创建目录:

一下是一个创建多级目录的一个函数,只是自己的一个类中用到的,
直接 就可以用
CreatedMultipleDirectory( char *direct )
{
string Directoryname = direct;

if ( Directoryname[Directoryname.length() - 1] != '\\' )
{
//Directoryname +=
Directoryname.append( 1, '\\');

}
std::vector<string> vpath;
string strtemp;
bool bSuccess = false;
for ( int i = 0; i < Directoryname.length(); i++ )
{
if ( Directoryname[i] != '\\')
{
strtemp.append( 1,Directoryname[i] );
}
else
{
vpath.push_back( strtemp );
strtemp.append( 1, '\\' );
}
}
std::vector<string>:: const_iterator vIter;
for ( vIter = vpath.begin();vIter != vpath.end(); vIter++ )
{
bSuccess = CreateDirectory( vIter->c_str(), NULL ) ? true :false;
}


return bSuccess;
}
ltc_mouse 2009-05-17
  • 打赏
  • 举报
回复
SetCurrentDirectory 把当前目录设置到exe文件所在目录?
秋兔子 2009-05-17
  • 打赏
  • 举报
回复
默认不是当前文件夹吗?

而且命令行下没问题,只是拖拽方式有问题而已
fleiou2008 2009-05-17
  • 打赏
  • 举报
回复
写的路径有问题吧,CreateFile()函数的参数好像也支持相对路径的的

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧