我对此有点困惑,但是我无法理解为什么一个代码正在工作而另一个代码不工作......看起来它们是相同的,但是最大的一个在字符串中出现错误并且调用函数“GetFileAttributes” 。 第一个代码不起作用。
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) {
if (argc < 2){
char answer;
do
{
cout << "You didn't type in the path to the file. Do you want to do it now? [y/n]" << endl;
cin >> answer;
} while (!cin.fail() && answer != 'y' && answer != 'Y' && answer != 'n' && answer != 'N');
cin.clear();
if (answer == 'N' || answer == 'n'){
return 0;
}
printf("%s", "Type in the path to the file\n");
scanf("%s", (argv + 1));
}
//LPCWSTR l = (LPCWSTR) (argv+1);
DWORD d = GetFileAttributes(argv[1]);
printf("%s", "Attrbiutes for this file are\n");
if (d == INVALID_FILE_ATTRIBUTES){
printf("%s", "Invalid attributes\n");
}
if (d & FILE_ATTRIBUTE_ARCHIVE){
printf("%s", "Archive\n");
}
if (d & FILE_ATTRIBUTE_COMPRESSED){
printf("%s", "Compressed\n");
}
if (d & FILE_ATTRIBUTE_DIRECTORY){
printf("%s", "Directory\n");
}
if (d & FILE_ATTRIBUTE_HIDDEN){
printf("%s", "Hidden\n");
}
if (d & FILE_ATTRIBUTE_READONLY){
printf("%s", "Read-only\n");
}
_getch();
return 0;
}
这是工作中的
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
DWORD x = GetFileAttributes(argv[1]);
if (x == INVALID_FILE_ATTRIBUTES)
{
std::cout << "error" << std::endl;
return 0;
}
if (x & FILE_ATTRIBUTE_ARCHIVE)
{
std::cout << "archive" << std::endl;
}
if (x & FILE_ATTRIBUTE_HIDDEN)
{
std::cout << "hidden" << std::endl;
}
if (x & FILE_ATTRIBUTE_READONLY)
{
std::cout << "read only" << std::endl;
}
if (x & FILE_ATTRIBUTE_SYSTEM)
{
std::cout << "system" << std::endl;
}
if (x & FILE_ATTRIBUTE_TEMPORARY)
{
std::cout << "temporary" << std::endl;
}
_getch();
return 0;
}
答案 0 :(得分:0)
这不是使用argv
的正确方法。 不要修改。将其视为只读。使用单独的变量来保存文件名,提示用户在需要时填充该变量,然后在使用文件名时使用变量而不是argv
。
此外,新操作系统版本引入了新的文件属性,您没有考虑到这些属性。您应输出所有属性,甚至是您无法识别的属性。
此外,您应该停止混合C和C ++ I / O.选择其中一个并与之保持一致。
尝试更像这样的事情:
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
std::string filename;
char ch;
if (argc >= 2)
{
filename = argv[1];
}
else
{
do
{
std::cout << "You didn't provide a path to the file. Do you want to type it now? [y/n]" << std::endl;
if (!(std::cin >> ch))
return 0;
}
while ((ch != 'y') && (ch != 'Y') && (ch != 'n') && (ch != 'N'));
if ((ch == 'N') || (ch == 'n'))
return 0;
cin.clear();
do
{
std::cout << "Type in the path to the file" << std::endl;
if (!std::getline(std::cin, filename))
return 0;
}
while (filename.empty());
}
DWORD d = GetFileAttributesA(filename.c_str());
std::cout << "Attributes for file: " << filename << std::endl;
if (d == INVALID_FILE_ATTRIBUTES)
{
std::cout << "Invalid attributes" << std::endl;
}
else
{
if (d & FILE_ATTRIBUTE_ARCHIVE)
{
std::cout << "Archive" << std::endl;
d &= ~FILE_ATTRIBUTE_ARCHIVE;
}
if (d & FILE_ATTRIBUTE_COMPRESSED)
{
std::cout << "Compressed" << std::endl;
d &= ~FILE_ATTRIBUTE_COMPRESSED;
}
if (d & FILE_ATTRIBUTE_DIRECTORY)
{
std::cout << "Directory" << std::endl;
d &= ~FILE_ATTRIBUTE_DIRECTORY;
}
if (d & FILE_ATTRIBUTE_HIDDEN)
{
std::cout << "Hidden" << std::endl;
d &= ~FILE_ATTRIBUTE_HIDDEN;
}
if (d & FILE_ATTRIBUTE_READONLY)
{
std::cout << "Read-only" << std::endl;
d &= ~FILE_ATTRIBUTE_READONLY;
}
if (d != 0)
{
std::cout << "Other: " << std::hex << std::showbase << std::setw(8) << std::setfill('0') << d << std::endl;
}
}
std::cout << "Press a key to exit" << std::endl;
std::cin >> ch;
return 0;
}