Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Открытие файлов на запись (http://forum.oszone.net/showthread.php?t=235229)

O L E G 23-05-2012 17:26 1921154

Открытие файлов на запись
 
Подскажите код, с помощью которого можно открыть файлы на запись или установить защиту на него, Но при этом что бы я мог считать с него данные, но нем мог их записать и удалить сам файл. За ранее спасибо

ferget 23-05-2012 17:37 1921161

Код:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    fstream fin;
    fin.open("input.txt", fstream::in);

    return 0;
}


O L E G 30-05-2012 15:47 1925024

Работает!
НО на чтение (не возможно перенести,удалить,переименовать) но можно записать в него!!!
Подскажи, как сделать так что бы было только чтение на файле, но записать нельзя было бы в него.
Будет проблема еще с записью потому что на файле стоит Read Only, надо снять его, после открыть на запись и снова установить чтение
Помогите, я только начинаю поэтому не которые аспекты Трудно найти
Спасибо

O L E G 30-05-2012 17:05 1925072

Пробовал
Код:

-fstream - обощенный поток ввода/вывода в файл
 -ofstream - поток записи в файл

-----
Код:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <clocale>

using std::cout;
using std::endl;
using namespace std;

int main()
{
        setlocale(LC_CTYPE,"Russian");
    ifstream fin;
    fin.open("C://1.txt", ifstream::in);
        cout << "Защита установлена C://boot.ini" << endl;
        system("pause");
    return 0;
}

но записать все равно возможно, к примеру файл boot.ini, как поставить защиту от записи,но на чтение оставить

ferget 31-05-2012 03:37 1925343

вот простой пример
на время работы программы снимается атрибут readonly, в файл записать нельзя

Код:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{

    system ("attrib -r input.txt");
    fstream fin;
    fin.open("input.txt", fstream::in|fstream::out);

    int k=0;
    while(k!=1)
    {
        cin>>k;
    }

    system ("attrib +r input.txt");
    return 0;
}


O L E G 31-05-2012 09:46 1925411

ferget, проверил скрипт, работает до этого действия

Код:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{

    system ("attrib -r input.txt");
    fstream fin;
    fin.open("input.txt", fstream::in|fstream::out);

Дальше стоит окно и не каких действий! Причем запись произвести удаеться в файл

А если так попробовать
Код:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <clocale>

using std::cout;
using std::endl;

using namespace std;

int main()
{
        setlocale(LC_CTYPE,"Russian");
    system ("attrib -r input.txt");
    fstream fin;
    fin.open("input.txt", fstream::in|fstream::out);
        system ("attrib +r input.txt");
        cout << "Защита установлена input.txt" << endl;
        system("pause");
    return 0;
}

Все работает,кроме (опять же запись в файл производиться)

ferget 31-05-2012 09:57 1925424

Цитата:

Цитата O L E G
Дальше стоит окно и не каких действий!»

так никаких действий быть и не должно, если введете 1, программа завершит работу

Цитата:

Цитата O L E G
Причем запись произвести удаеться в файл »

странно, у меня работает так, можно открыть файл, блокнотом, можно написать в блокноте, но при сохранении пишет "файл занят другим процессом"

O L E G 31-05-2012 14:45 1925557

ferget, перепроверил, не работает (
Даже не пойму в чем проблема. Интересно даже самому

ferget 01-06-2012 03:09 1925851

так попробуйте

Код:

#include <iostream>
#include <fstream>
#include <windows.h>
#include <stdio.h>

using namespace std;

int main()
{
        HANDLE hAppend;
        DWORD  dwBytesRead=10, dwBytesWritten=10, dwPos=0;

        hAppend = CreateFile(TEXT("inp.txt"),
                GENERIC_WRITE,       
                FILE_SHARE_READ,         
                NULL,                   
                OPEN_ALWAYS,             
                FILE_ATTRIBUTE_NORMAL,   
                NULL);                   

        if (hAppend == INVALID_HANDLE_VALUE)
        {
                printf("Could not open inp.txt.");
                return 0;
        }

        LockFile(hAppend, dwPos, 0, dwBytesRead, 0);

        int k=0;
        while(k!=1)
        {
                cin>>k;
        }

        UnlockFile(hAppend, dwPos, 0, dwBytesRead, 0);
        return 0;
}


O L E G 01-06-2012 08:11 1925880

Спасибо, в этот раз помогло все. Если не ошибаюсь это функия winapi и она более функциональна чем прошлый код

Интересно, а приемлема такая же блокировка в ключам реестра?


Чуть подредактил твой код,убрал от туда функцию
Код:

LockFile(hAppend, dwPos, 0, dwBytesRead, 0);
работает как надо, файл читаемый но записать и изменить нельзя, Спасибо за помощь еще раз

O L E G 01-06-2012 10:19 1925916

Не обошлось без маленького вопроса! Как указать сразу не сколько файлов
Код:

hAppend = CreateFile(TEXT("inp.txt", "inp2.txt"), так не рабоет
ну а так
Код:

hAppend = CreateFile(TEXT("inp.txt"),
hAppend = CreateFile(TEXT("inp2.txt"),

функция не поддерживает два аргумента

ferget 01-06-2012 11:02 1925936

для каждого файла нужна своя переменная

лучше собрать их в массив

O L E G 01-06-2012 13:00 1925999

а как все это дело в массив загнать?
через
Код:

int
            for

я просто с этим еще не сталкивался

O L E G 01-06-2012 13:24 1926020

или что то вроде этогою на примере
Код:

int main()
{
  int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 
  for(int i = 0; i < 10; ++i)
    std::cout << array[i] << ",";
  std::cout << std::endl;


ferget 01-06-2012 13:34 1926032

массивы это на потом, а пока вручную

Код:

hAppend = CreateFile(TEXT("inp.txt"), FILE_APPEND_DATA, FILE_SHARE_READ, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hAppend == INVALID_HANDLE_VALUE)
    {
      printf("Could not open inp.txt.");
      return 1;
    }

hAppend1 = CreateFile(TEXT("inp1.txt"), FILE_APPEND_DATA, FILE_SHARE_READ, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hAppend == INVALID_HANDLE_VALUE)
    {
      printf("Could not open inp1.txt.");
      return 1;
    }

//и т.д.



Время: 18:52.

Время: 18:52.
© OSzone.net 2001-