PDA

Показать полную графическую версию : [решено] Открытие файлов на запись


O L E G
23-05-2012, 17:26
Подскажите код, с помощью которого можно открыть файлы на запись или установить защиту на него, Но при этом что бы я мог считать с него данные, но нем мог их записать и удалить сам файл. За ранее спасибо

ferget
23-05-2012, 17:37
#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
Работает!
НО на чтение (не возможно перенести,удалить,переименовать) но можно записать в него!!!
Подскажи, как сделать так что бы было только чтение на файле, но записать нельзя было бы в него.
Будет проблема еще с записью потому что на файле стоит Read Only, надо снять его, после открыть на запись и снова установить чтение
Помогите, я только начинаю поэтому не которые аспекты Трудно найти
Спасибо

O L E G
30-05-2012, 17:05
Пробовал

-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
вот простой пример
на время работы программы снимается атрибут 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
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
Дальше стоит окно и не каких действий!»
так никаких действий быть и не должно, если введете 1, программа завершит работу

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

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

O L E G
31-05-2012, 14:45
ferget, перепроверил, не работает (
Даже не пойму в чем проблема. Интересно даже самому

ferget
01-06-2012, 03:09
так попробуйте


#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
Спасибо, в этот раз помогло все. Если не ошибаюсь это функия winapi и она более функциональна чем прошлый код

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


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

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


работает как надо, файл читаемый но записать и изменить нельзя, Спасибо за помощь еще раз

O L E G
01-06-2012, 10:19
Не обошлось без маленького вопроса! Как указать сразу не сколько файлов

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

ну а так

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

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

ferget
01-06-2012, 11:02
для каждого файла нужна своя переменная

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

O L E G
01-06-2012, 13:00
а как все это дело в массив загнать?
через int
for

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

O L E G
01-06-2012, 13:24
или что то вроде этогою на примере

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
массивы это на потом, а пока вручную


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;
}

//и т.д.




© OSzone.net 2001-2012