Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

SetFileAttributes(); Visual C++ 2005. помогите разобратся

14K
18 августа 2007 года
2504
33 / / 27.03.2007
_finddata_t fileinfo;

SetFileAttributes(fileinfo.name,FILE_ATTRIBUTE_NORMAL);

Я пытаюсь установить атрибут файлу. он выдаёт ошибку.

Error 20 error C2664: 'SetFileAttributesW' : cannot convert parameter 1 from 'char [260]' to 'LPCWSTR'


что такое LPCWSTR? Но это не очень важно.

Подскажите. Как пользоватся функцией SetFileAttributes();

Что она должна принимать в качестве первого параметра??


Спасибо всем за внимание.
320
18 августа 2007 года
m_Valery
1.0K / / 08.01.2007
По умолчанию в Visual Studio 2005 стоит юникод.Смотри Project -> Properties.В General находишь Character Set.У тебя там стоит Use Unicode Character Set.Поставь что-нибудь другое и этой ошибки не будет.Например Not Set.А о том как пользоваться функцией смотри MSDN
 
Код:
BOOL WINAPI SetFileAttributes(
  LPCTSTR lpFileName,
  DWORD dwFileAttributes
);
257
18 августа 2007 года
kosfiz
1.6K / / 18.09.2005
Цитата: m_Valery
А о том как пользоваться функцией смотри MSDN


да, а если быть точнее то вот этот пример http://msdn2.microsoft.com/en-us/library/aa365522.aspx

14K
21 августа 2007 года
2504
33 / / 27.03.2007
Я хоть и начинающий, но МСДН читаю!!!!!

А к Вам обратился, потому, что не понял я в примере нифига!

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;

}
16K
22 августа 2007 года
Zbyszek
118 / / 08.08.2007
Не совсем понял что именно ты не понимаешь. Делается вроде бы так:

 
Код:
SetFileAttributes(szPath, FILE_ATTRIBUTE_NORMAL);

где szPath - путь+имя файла, например C:\file.txt
14K
22 августа 2007 года
2504
33 / / 27.03.2007
После замены кодировки, ошибка исчезла, но файл остаётся!!! Атрибут не меняется!!!
Подскажите почему? Пробовал прописать напрямую путь
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;
                }
16K
22 августа 2007 года
Zbyszek
118 / / 08.08.2007
Честно сказать, даже и не знаю. У меня (правда на Delphi) SetFileAttributes отлично работает. Может быть, что-то неправильно в самом коде? Что возвращает SetFileAttributes? Попробуй GetLastError, может что-то покажет.
14K
27 августа 2007 года
2504
33 / / 27.03.2007
Думаю я не последний, кто в этом захочет разобратся. Вот сделал.

Вставте этот кейс в мою программу, что я постил выше и все работает.
только #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;

                }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог