В моей программе я пытаюсь сгенерировать случайное имя файла, а затем использую fopen для создания файла с этим именем. Процесс идет следующим образом

  1. Создать случайное имя файла
  2. Проверьте, не являемся ли мы администратором, попытавшись создать файл с таким именем в c: \
  3. Записать материал в файл

Для создания случайного имени файла я использую следующую функцию:

const char *RandomName(const char *suffix,unsigned int length)
    {
        const char alphanum[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";
        int stringLength = sizeof(alphanum) - 1;
        std::string Str;
        unsigned int i;
        Str.append("c:\\");
        for( i = 0; i < length; ++i)
        {
            Str += alphanum[rand() % stringLength];
        }
        Str += suffix;
        const char *str =Str.c_str();
        return str;
    }

Для создания файла и проверки наличия администратора я использую следующую функцию:

bool IsAdmin()
{
    const char *n = RandomName(".BIN",5);
    cout << n << endl;
    FILE *fp;
    fp = fopen((const char *)n,"w+");
    if (fp == NULL) {
        cout << "File pointer was NULL" << endl;
        return false;
    } else {
        cout << "File pointer is legit" << endl;
        //fclose(fp);
        //remove(n);
        int b;
        for(b = 0; b != 1338; b++)
        {
            char f = 'c';
            fputc(f, fp);
        }
        return true;
    }
}

При запуске от имени администратора программа печатает:

c:\9UswA.BIN
Not Admin!

Как заставить программу создать файл с именем, которое соответствует отображаемому на экране? и без схематичного поведения?

-3
Semaphore 5 Сен 2016 в 05:37

3 ответа

Лучший ответ

Чтобы решить эту проблему, я избавился от функции RandomName и отредактировал IsAdmin, чтобы включить ее код, с помощью нескольких настроек, которые мне удалось заставить ее работать хотя бы несколько хорошо, код, который я закончил с было:

void AdminWrite(const char *suffix,unsigned int length)
{
    FILE *fp;
    const char alphanum[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv";
    int stringLength = sizeof(alphanum) - 1;
    std::string Str;
    unsigned int i;

    Str.append("c:\\Users\\UserName\\Desktop\\");
    for( i = 0; i < length; ++i)
    {
        Str += alphanum[rand() % stringLength];
    }
    Str += suffix;
    const char *str =Str.c_str();
    cout << str << endl;
    fp = fopen(str,"w+");
    if (fp == NULL) {
            cout << "File pointer was NULL" << endl;
            return;
    } else {
        cout << "File pointer is legit" << endl;
        int b;
        for(b = 0; b != 1337; b++)
        {
            char f = 'c';
            fputc(f, fp);
        }
        return;
    }
    return;
}
0
Semaphore 5 Сен 2016 в 16:20

Я думаю, что запуск созданного здесь .exe от имени администратора позволит вам создать файл. Запустите программу не из любой IDE, а вручную из местоположения файла и запустите от имени администратора.

0
Gaurav Chauhan 5 Сен 2016 в 02:46

Просто используйте tmpnam c api

Пример:

#include <stdio.h>

  int main(void)
  {
    char name[40];
    int i;

    for(i=0; i<3; i++) {
      tmpnam(name);
      printf("%s ", name);
    }
    return 0;
  }
1
mahdavi 7 Фев 2020 в 15:54