| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2055 人关注过本帖
标题:DeleteFile api的问题
只看楼主 加入收藏
cbd666
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2019-9-26
结帖率:66.67%
收藏
已结贴  问题点数:1 回复次数:3 
DeleteFile api的问题
程序代码:
#include<windows.h>
#include<stdio.h>
#include<wchar.h>

using namespace std;
int main(int argc, PTCHAR argv[]) {
    /*
        删除文件 api.exe -d 文件路径
        复制文件 api.exe -c 路径1 路径2
        移动/重命名文件 api.exe 路径1 路径2
    */

    if (0 == lstrcmp(L"-d", argv[1]) && argc == 3) { // 满足条件是否是 第二个参数为-d 并且 命令行参数的个数为3  该函数结束的两个值都是为LPCWSTR
        DeleteFile(argv[2]);  //unicode的时候 接收的值为 LPCWSTR
        printf("删除成功");
    }
    else {
        printf("删除失败");
    }
    printf("argv[0]:%ls\n", argv[0]);
    printf("argv[1]:%ls\n", argv[1]);
    printf("argv[2]:%ls\n", argv[2]);
    printf("参数数量为:%d", argc);

    system("pause");
    return 0;
    

}


发现删除不了,命令为 1.exe -d 1.txt 发现报错失败,然后尝试打印argv[0] 1 2 发现都为空 为什么哇
搜索更多相关主题的帖子: 路径 文件 api printf exe 
2019-11-25 20:36
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:1 
既然用了 PTCHAR 等宏,那你得告诉别人你定义了 UNICODE/_UNICODE 没有了。
不但如此,你的 lstrcmp 宏却直接指定宽字符 L"-d",printf("%ls"直接认定argv[]是宽字符。
我不知道该说什么,你自己先捋捋吧。

要么用 多字节字符的那一套,要么用 宽字符的那一套,要么用 宏的那一套(通过宏来决定用多字节字符还是宽字符),不能牛头配马嘴。
即,要么 int main( int argc, char* argv[] )
    要么 int wmain( int argc, wchar_t* argv[] )
    要么 int _tmain( int argc, _TCHAR* argv[] )
不存在你代码中的 int main(int argc, PTCHAR argv[]),既多字节又宽字符

另外还有个小错误
if (0 == lstrcmp(L"-d", argv[1]) && argc == 3)
假如 argc == 1 的话,你访问 argv[1] 是未定义行为,你应该将这两个条件换一下位置。
即,要么 if( argc==3 && strcmp("-d",argv[1])==0 ) 在多字节字符集下
    要么 if( argc==3 && wcscmp(L"-d",argv[1])==0 ) 在宽字符集下
    要么 if( argc==3 && _tcscmp(_T("-d"),argv[1])==0 ) 用宏控制使用多字节字符还是宽字符

2019-11-26 09:07
cbd666
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2019-9-26
收藏
得分:0 
回复 2楼 rjsp
老哥 我写好了,这样我写的是不是都是基于宽字节UNICODE来写的,但是我还有一个问题,宏定义中比如PTCHAR,我转到定义的时候是这样子的,还有自己查阅了才知道wmain函数是main函数的宽字符版本,一般在Unicode编码下使用,但是我不懂比如下面得ifdef UNICODE才进行下面的操作,他是如何知道我们定义的字符集是UNICODE,是根据wmain入口函数直接帮你认为是UNICODE的吗,还是根据项目属性来的
图片附件: 游客没有浏览图片的权限,请 登录注册
,还是有什么关系不懂了。。。。。如果可以的话 能够解答下吗
程序代码:
#ifdef  UNICODE                     // r_winnt

#ifndef _TCHAR_DEFINED
typedef WCHAR TCHAR, *PTCHAR;



程序代码:
#include<windows.h>
#include<stdio.h>

int wmain(int argc, wchar_t * argv[]) {
    /*
        删除文件 api.exe -d 文件路径
        复制文件 api.exe -c 路径1 路径2
        移动/重命名文件 api.exe -m 路径1 路径2
    */

    if (argc == 3 && 0 == lstrcmp(L"-d", argv[1])) { // 满足条件是否是 第二个参数为-d 并且 命令行参数的个数为3  该函数结束的两个值都是为LPCWSTR


        if (!DeleteFile(argv[2])) {  //unicode的时候 接收的值为 LPCWSTR
            printf("删除失败 \n");
        }
        else {
            printf("删除成功 \n");
        }


    }else if (argc == 4 && 0 == lstrcmp(L"-c", argv[1])) {
        if (!CopyFile(argv[2], argv[3], true)) { //第三个参数为true那么文件如果已经存在则不进行覆盖
            //复制失败,其中一种可能是存在文件同名,copyfile 返回值为0x50
            if (getchar() == 'y') {
                if (!CopyFile(argv[2], argv[3], false)) { //第三个参数为false那么文件如果已经存在则直接覆盖
                    printf("文件复制失败");
                }else {
                    printf("文件复制成功");
                }
            }
        }else
            printf("文件复制成功! \n");
    }else if (argc == 4 && 0 == lstrcmp(L"-m", argv[1])) {
        //进行移动/重命名文件的操作
        if (!MoveFile(argv[2],argv[3])) {  //movefile 和 copyfile api 参数的数据类型一样,用法也类似
            printf("文件移动失败! \n");
        }else {
            printf("文件移动成功! \n");
        }
    }else {
        printf("参数错误! 请重新输入");
    }

    system("pause");
    return 0;
    

}
2019-11-26 10:55
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
回复 3楼 cbd666
没听懂你想问什么。
对于VC,如果指明了link参数 /ENTRY,那就用其指定的函数作 startup 函数;
        否则如果有 main 函数,那就用 main 函数作 startup 函数;
        否则如果有 wmain 函数,那就用 wmain 函数作 startup 函数。
2019-11-26 12:27
快速回复:DeleteFile api的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042561 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved