BOOL WINAPI SetFileAttributes(
LPCTSTR lpFileName,
DWORD dwFileAttributes
);
SetFileAttributes(); Visual C++ 2005. помогите разобратся
SetFileAttributes(fileinfo.name,FILE_ATTRIBUTE_NORMAL);
Я пытаюсь установить атрибут файлу. он выдаёт ошибку.
Error 20 error C2664: 'SetFileAttributesW' : cannot convert parameter 1 from 'char [260]' to 'LPCWSTR'
что такое LPCWSTR? Но это не очень важно.
Подскажите. Как пользоватся функцией SetFileAttributes();
Что она должна принимать в качестве первого параметра??
Спасибо всем за внимание.
Код:
Цитата: m_Valery
А о том как пользоваться функцией смотри MSDN
да, а если быть точнее то вот этот пример http://msdn2.microsoft.com/en-us/library/aa365522.aspx
А к Вам обратился, потому, что не понял я в примере нифига!
LPCTSTR что это за тип данных?
DWORD что это за тип данных?
Но это пока не важно. Я со временем это буду учить! И всё станет на свои места.
Задание было,
/*Программа для перемещения каталогов (перемещаются все вложенные папки и файлы).
В том случае, если у удаляемого файла (каталога) установлен атрибут Read-Only, необходимо вывести следующее меню:
1. Удалять? 2. Пропустить? 3.Удалять для всех? 4. Отмена?
*/
и проблема в том, что я не могу поменять атрибут файла!!! Все, что я прошу, подскажите, как это сделать, не вникая, пока что, в подробности DWORD и LPCTSTR!!
Спасибо за терпение и понимание.
Вот код:
Код:
#include <stdio.h>
#include <io.h>
#include <string.h>
#include <direct.h>
#include <windows.h>
#include <iostream>
using namespace std;
enum {forAll, question}dell=question,rewrite=question;
/************************
Функция поиска файла по адресу.
************************/
bool Find(char dest[_MAX_PATH]){
_finddata_t fileinfo;
long handle;
if ((handle = _findfirst(dest, &fileinfo)) == -1)
{
return true;
}
else
return false;
//return true;
}
/************************
Запрос при совпадении имени
************************/
int CopyQuestion(char *destination){
int ch;
if(rewrite==question)
{
cout<<"file "<<destination<<" exist"<<endl;
cout<<"\t1 - rewrite\n\t2 - rewrite for all\n\t3 - skip\n\t4 - cancel"<<endl;
}
if(rewrite!=forAll)
{
cin>>ch;
if(ch==2) rewrite=forAll;
}
else
ch=2;
switch (ch)
{
case 1:
{
return 1;
break;
}
case 2:
{
return 2;
break;
}
case 3:
{
return 3;
break;
}
case 4:
{
return 4;
break;
}
}
}
/************************
Функция копирования файла
************************/
bool CopyFile(char *source,char *destination){
FILE *dest, *src;
//открытие копируемого файла
if((src=fopen(source,"r"))==0)
return false;
// Получение дескриптора файла
//int handle=_fileno(src);
// выделение памяти под буффер
char *bufer=new char[65536];
//проверка на совпадение имени файла в папке, куда копируется файл.
bool flag=Find(destination);
//открытие файла, куда копируется
if (flag==true){
if((dest=fopen(destination,"w+"))==0){
delete[]bufer;
return false;
}
}
else{
int ch=CopyQuestion(destination);//если имена совпадают
if(ch==1||ch==2){
if((dest=fopen(destination,"w+"))==0){
delete[]bufer;
return false;
}
}
if(ch==3){
return true;
}
if(ch==4) return false;
}
int realsize;
while(feof(src)==0){
// Чтение данных из файла
realsize=fread(bufer,sizeof(char),65536,src);
// Запись данных в файл
fwrite(bufer,sizeof(char),realsize,dest);
}
fclose(src);
fclose(dest);
return true;
}
/************************
Функция удаления
************************/
void Remove(char source[_MAX_PATH]){
remove(source);
_rmdir(source);
}
/************************
Функция фиг зает чего
************************/
bool Work(char src[_MAX_PATH],char dest[_MAX_PATH]){
char tmp_s[_MAX_PATH];
char source[_MAX_PATH];
char destination[_MAX_PATH];
strcpy(tmp_s,src);
strcpy(destination,dest);
// Переменные, необходимые для перебора файлов и подкаталогов
_finddata_t fileinfo;
long handle;
// Начинаем поиск
char mask[_MAX_PATH]="*.*";
if ((handle = _findfirst(strcat(src,mask), &fileinfo)) == -1)
{
cout << "Cannot find anything in specified path!\n";
return false;
}
do
{
// Проверяем что нашли: файл или каталог, если каталок, то входим
if ((fileinfo.attrib==_A_SUBDIR)&&(strcmp(fileinfo.name,".")!=0)&&(strcmp(fileinfo.name,"..")!=0)){
strcpy(source,tmp_s);
strcpy(destination,dest);
strcat(source,fileinfo.name);
strcat(destination,fileinfo.name);
_mkdir(destination);
Work(strcat(source,"\\"),strcat(destination,"\\"));
}
strcpy(source,tmp_s);
strcpy(destination,dest);
if(fileinfo.attrib!=_A_SUBDIR) {//если каталог, то пропустить функцию для файла.
if(false==CopyFile(strcat(source,fileinfo.name),strcat(destination,fileinfo.name))) continue;
}
if(fileinfo.attrib==_A_SUBDIR) {
strcat(source,fileinfo.name);
strcat(destination,fileinfo.name);
}
{
int ch;
if(dell==question)
{
cout<<"file "<<fileinfo.name<<" is read only"<<endl;
cout<<"\t1 - remove\n\t2 - remove for all\n\t3 - skip\n\t4 - cancel"<<endl;
}
if(dell!=forAll)
{
cin>>ch;
if(ch==2) dell=forAll;
}
else
ch=2;
switch (ch)
{
case 1:
{
//fileinfo.attrib=_A_NORMAL;
/*ВОТ ПРОБЛЕММА!!!!!!!!!!!!!!!!!!!!!!!
Мне нужно тут поменять аттрибут файла!!!
SetFileAttributes(тут путь? или имя? | атрибут);
как писать?
*/
if(fileinfo.attrib==_A_NORMAL)cout<<"Fack!!!";
break;
}
case 2:
{
fileinfo.attrib=_A_NORMAL;
break;
}
case 3:
{
break;
}
case 4:
{
return true;
break;
}
}
}
//Удаление после того, как скопировал.
Remove(source);
}
// Ищем следующий файл или каталог и продолжаем,
// пока не закончились подходящие файлы или каталоги
while (_findnext(handle, &fileinfo) != -1);
// Закрываем процесс поиска
_findclose(handle);
return true;
}
void main(int argc, char *argv[])
{
char src[_MAX_PATH]="d:\\src\\", dest[_MAX_PATH]="d:\\dest\\";
if (argc==2){
strcpy(src,argv[1]);
strcat(src,"\\");
}
if (argc==3){
strcpy(dest,argv[2]);
strcat(dest,"\\");
}
bool flag=Work(src,dest);
if(flag==true) cout<<"Ok.."<<endl;
else cout<<"Error!"<<endl;
}
#include <io.h>
#include <string.h>
#include <direct.h>
#include <windows.h>
#include <iostream>
using namespace std;
enum {forAll, question}dell=question,rewrite=question;
/************************
Функция поиска файла по адресу.
************************/
bool Find(char dest[_MAX_PATH]){
_finddata_t fileinfo;
long handle;
if ((handle = _findfirst(dest, &fileinfo)) == -1)
{
return true;
}
else
return false;
//return true;
}
/************************
Запрос при совпадении имени
************************/
int CopyQuestion(char *destination){
int ch;
if(rewrite==question)
{
cout<<"file "<<destination<<" exist"<<endl;
cout<<"\t1 - rewrite\n\t2 - rewrite for all\n\t3 - skip\n\t4 - cancel"<<endl;
}
if(rewrite!=forAll)
{
cin>>ch;
if(ch==2) rewrite=forAll;
}
else
ch=2;
switch (ch)
{
case 1:
{
return 1;
break;
}
case 2:
{
return 2;
break;
}
case 3:
{
return 3;
break;
}
case 4:
{
return 4;
break;
}
}
}
/************************
Функция копирования файла
************************/
bool CopyFile(char *source,char *destination){
FILE *dest, *src;
//открытие копируемого файла
if((src=fopen(source,"r"))==0)
return false;
// Получение дескриптора файла
//int handle=_fileno(src);
// выделение памяти под буффер
char *bufer=new char[65536];
//проверка на совпадение имени файла в папке, куда копируется файл.
bool flag=Find(destination);
//открытие файла, куда копируется
if (flag==true){
if((dest=fopen(destination,"w+"))==0){
delete[]bufer;
return false;
}
}
else{
int ch=CopyQuestion(destination);//если имена совпадают
if(ch==1||ch==2){
if((dest=fopen(destination,"w+"))==0){
delete[]bufer;
return false;
}
}
if(ch==3){
return true;
}
if(ch==4) return false;
}
int realsize;
while(feof(src)==0){
// Чтение данных из файла
realsize=fread(bufer,sizeof(char),65536,src);
// Запись данных в файл
fwrite(bufer,sizeof(char),realsize,dest);
}
fclose(src);
fclose(dest);
return true;
}
/************************
Функция удаления
************************/
void Remove(char source[_MAX_PATH]){
remove(source);
_rmdir(source);
}
/************************
Функция фиг зает чего
************************/
bool Work(char src[_MAX_PATH],char dest[_MAX_PATH]){
char tmp_s[_MAX_PATH];
char source[_MAX_PATH];
char destination[_MAX_PATH];
strcpy(tmp_s,src);
strcpy(destination,dest);
// Переменные, необходимые для перебора файлов и подкаталогов
_finddata_t fileinfo;
long handle;
// Начинаем поиск
char mask[_MAX_PATH]="*.*";
if ((handle = _findfirst(strcat(src,mask), &fileinfo)) == -1)
{
cout << "Cannot find anything in specified path!\n";
return false;
}
do
{
// Проверяем что нашли: файл или каталог, если каталок, то входим
if ((fileinfo.attrib==_A_SUBDIR)&&(strcmp(fileinfo.name,".")!=0)&&(strcmp(fileinfo.name,"..")!=0)){
strcpy(source,tmp_s);
strcpy(destination,dest);
strcat(source,fileinfo.name);
strcat(destination,fileinfo.name);
_mkdir(destination);
Work(strcat(source,"\\"),strcat(destination,"\\"));
}
strcpy(source,tmp_s);
strcpy(destination,dest);
if(fileinfo.attrib!=_A_SUBDIR) {//если каталог, то пропустить функцию для файла.
if(false==CopyFile(strcat(source,fileinfo.name),strcat(destination,fileinfo.name))) continue;
}
if(fileinfo.attrib==_A_SUBDIR) {
strcat(source,fileinfo.name);
strcat(destination,fileinfo.name);
}
{
int ch;
if(dell==question)
{
cout<<"file "<<fileinfo.name<<" is read only"<<endl;
cout<<"\t1 - remove\n\t2 - remove for all\n\t3 - skip\n\t4 - cancel"<<endl;
}
if(dell!=forAll)
{
cin>>ch;
if(ch==2) dell=forAll;
}
else
ch=2;
switch (ch)
{
case 1:
{
//fileinfo.attrib=_A_NORMAL;
/*ВОТ ПРОБЛЕММА!!!!!!!!!!!!!!!!!!!!!!!
Мне нужно тут поменять аттрибут файла!!!
SetFileAttributes(тут путь? или имя? | атрибут);
как писать?
*/
if(fileinfo.attrib==_A_NORMAL)cout<<"Fack!!!";
break;
}
case 2:
{
fileinfo.attrib=_A_NORMAL;
break;
}
case 3:
{
break;
}
case 4:
{
return true;
break;
}
}
}
//Удаление после того, как скопировал.
Remove(source);
}
// Ищем следующий файл или каталог и продолжаем,
// пока не закончились подходящие файлы или каталоги
while (_findnext(handle, &fileinfo) != -1);
// Закрываем процесс поиска
_findclose(handle);
return true;
}
void main(int argc, char *argv[])
{
char src[_MAX_PATH]="d:\\src\\", dest[_MAX_PATH]="d:\\dest\\";
if (argc==2){
strcpy(src,argv[1]);
strcat(src,"\\");
}
if (argc==3){
strcpy(dest,argv[2]);
strcat(dest,"\\");
}
bool flag=Work(src,dest);
if(flag==true) cout<<"Ok.."<<endl;
else cout<<"Error!"<<endl;
}
Код:
SetFileAttributes(szPath, FILE_ATTRIBUTE_NORMAL);
где szPath - путь+имя файла, например C:\file.txt
Подскажите почему? Пробовал прописать напрямую путь
SetFileAttributes("D:\\src\\1.exe", FILE_ATTRIBUTE_NORMAL);
но результат тот же.
Код:
case 1:
{
SetFileAttributes(destination, FILE_ATTRIBUTE_NORMAL);
if((fileinfo.attrib & _A_RDONLY)==1)
cout<<"Cannot change attribute";
break;
}
{
SetFileAttributes(destination, FILE_ATTRIBUTE_NORMAL);
if((fileinfo.attrib & _A_RDONLY)==1)
cout<<"Cannot change attribute";
break;
}
Честно сказать, даже и не знаю. У меня (правда на Delphi) SetFileAttributes отлично работает. Может быть, что-то неправильно в самом коде? Что возвращает SetFileAttributes? Попробуй GetLastError, может что-то покажет.
Вставте этот кейс в мою программу, что я постил выше и все работает.
только #include <Windows.h> не забудьте.
Всем спасибо за помощь. и Внимание.:)
Код:
case 1:
{
fileinfo.attrib = GetFileAttributes(source);
if (fileinfo.attrib==INVALID_FILE_ATTRIBUTES) cout<<"Can't read file attributes\n";
if ((fileinfo.attrib & _A_RDONLY))
{
SetFileAttributes(source, _A_NORMAL);
}
break;
}
{
fileinfo.attrib = GetFileAttributes(source);
if (fileinfo.attrib==INVALID_FILE_ATTRIBUTES) cout<<"Can't read file attributes\n";
if ((fileinfo.attrib & _A_RDONLY))
{
SetFileAttributes(source, _A_NORMAL);
}
break;
}