Что сучилось с правами доступа?

Николай II
Дата: 06.07.2015 01:17:24
Нужно было удалить картинки в папке (программно). Нашел такой код:
bool DeleteFiles(AnsiString DirName)
{
TSearchRec sr;
if (DirName.Length())
 {
 if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
 do
  {
  if (!(sr.Name=="." || sr.Name==".."))// это удалять не надо
   if (((sr.Attr & faDirectory) != faDirectory ) &&
   (sr.Attr != faDirectory))
	{
	DeleteFile(DirName+"\\"+sr.Name);// удаляем файл
	}
  }
 while (!FindNext(sr));// ищем опять, пока не найдем все
 FindClose(sr);
 }
return true;
}

DeleteFiles("E:\\Img\\");

Ничего не удалилось, но теперь ни в какую папку на диске Е невозможно сделать запись файлов из моих программ, пишет "Отказано в доступе" (на другие диски пишеться).
Другие программы на диск Е пишут как и раньше, а мои самописные не могут.
ВОПРОС: что я наделал, как убрать этот глобальный ReadOnly?
Пробовал свойства диска-безопасность-выставить права как на других дисках- не помогло (
-------------------------
C++ Builder 2010
Самоучка
Николай II
Дата: 06.07.2015 10:01:07
Неужели никто не знает?
SashaMercury
Дата: 06.07.2015 14:10:41
Николай II,
попробуйте выполнить такой код на диске где у вас проблемы, и сообщите о результате

#include <stdio.h>

...
FILE* test=fopen("test.txt","w");
fprintf(test,"Hello");
fclose(test);
...
mayton
Дата: 06.07.2015 14:58:45
Лучше так. Со ссылкой http://www.tutorialspoint.com/cprogramming/c_error_handling.htm
FILE * pf;
   int errnum;
   pf = fopen ("unexist.txt", "rb");
   if (pf == NULL)
   {
      errnum = errno;
      fprintf(stderr, "Value of errno: %d\n", errno);
      perror("Error printed by perror");
      fprintf(stderr, "Error opening file: %s\n", strerror( errnum ));
   }
   else
   {
      fclose (pf);
   }
   return 0;
Николай II
Дата: 06.07.2015 16:55:43
FILE* test=fopen("E:\\test.txt","w");
fprintf(test,"Hello");
fclose(test);

Выдал First chance exception at $747FB9BC. Exception class EAccessViolation with message 'Access violation at address 32B81AF8 in module 'CC32110MT.DLL'. Read of address F831552C'. Process OriCatalogGrabbing.exe (6296)
-----------------
FILE * pf;
   int errnum;
   pf = fopen ("E:\\unexist.txt", "rb");
   if (pf == NULL)
   {
	   errnum = errno;
	  Form1->Caption=IntToStr(errnum);
	  perror("Error printed by perror");
	  Memo1->Text=strerror( errnum );
   }
   else
   {
	  fclose (pf);
   }

Выдало номер ошибки: 2
Текст ошибки: No such file or directory
-----------------------
Неьольшое наблюдение, может поможет: когда папка с программой на диске Д:, то пишет только на Д:, а на Е: не хочет. Когда папка с программой на диске Е:, то успешно пишет и на Е: и на Д:.
mayton
Дата: 06.07.2015 17:42:09
При программировании под Win бывает много чудес. Во первых надо глянуть права вызывающего.
Тоесть разобраться кто ты есть. И от имени кого ты компилишь и запускаешь. Во вторых
посмотреть права на диск E:

Консольных тулзов для этого я не помню. Надо делать много мышко-кликов ... и скриншотить ...
вобщем пускай тем кому не лень подскажут.
Николай II
Дата: 06.07.2015 18:06:36
Да с этого я начал!
Пробовал в консоли diskpart смотреть - НЕ включен только чтение.
Потом в свойствах диска-безопасность установил для диска владельца себя и дал все права всему что было (стоят все галки). Не помогло.
Потом еще в консоли, запущенной с правами администратора, выполнял последовательно:
takeown /f E: /r /d y
icacls E: /grant:r имя:F /t
где имя - имя учетной записи.
не помогло.
Запускал и с правами админа и без. Антивирус отключал и перезагружался.
Главное почему, если я папку с экзешником переношу на Е, то права появляются писать на этот диск Е?!
Николай II
Дата: 06.07.2015 18:38:32
Еще одно наблюдение. Если экзешник программы на диске Д, то не хочет писать ни на какой диск кроме Д.
Если экзешник программы на любом другом диске кроме Д, то пишет куда угодно, в т.ч. и на Е и на Д. Скорее всего проблема в диске Д заключается. Но в чем?
mayton
Дата: 06.07.2015 18:53:07
Посмотри dos-овские R/O, System.
Николай II
Дата: 06.07.2015 19:22:12
Напишите, пожалуйста, подробнее, что посмотреть, так как я ввел в Яндексе "DOS R/O" оно не может понять что я хочу от него, наверное, слишком короткий запрос.