Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
Builder 6

Создание временного файла

09.04.2020, 10:37. Показов 4668. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, ребят! Кто-нибудь сталкивался с созданием временного файла, например из потока?
Как это делается? Нужно создать временный PDF, пока идей особо нет...поиски не увенчались успехом..

Вот так можно получить темповский фолдер:
C++
1
static System::UnicodeString __fastcall GetTempPath();
Еще отыскала про метод
C++
1
std :: FILE * tmpfile ( ) ;
но там немного...

Кто знает как этим пользоваться?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.04.2020, 10:37
Ответы с готовыми решениями:

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

Создание временного уникального файла
Помогите пожалуйста, нужно создать временный файл с уникальным именем, я знаю что это делается с помощью tmpfile вот так: $temp =...

Создание временного пользователя
Возникла такая задача, работаю в техникуме, есть доменный пользователь Student под которым работают студенты на своих ПК, но студенты...

6
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
09.04.2020, 10:54
Лучший ответ Сообщение было отмечено TrollHammer как решение

Решение

В чем проблема-то? В генерации имени для временного файла? Тогда пользуемся TPath::GetTempFileName

Для BCB6 - используем WinAPI: Creating and Using a Temporary File , там есть вся последовательность действий для получения временной папки + получения имени временного файла...
2
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
09.04.2020, 16:01  [ТС]
volvo, спасибо! получилось вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE tempFile;
tempFile = CreateFile("myTemp",
             GENERIC_WRITE |GENERIC_READ,
             FILE_SHARE_WRITE | FILE_SHARE_READ,
             NULL,
             CREATE_ALWAYS,
             FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,
             NULL);
      if (tempFile==0) ShowMessage("0");
}
Это создает временный файл в папке прожекта, теперь есть вопрос, как туда из потока записать?
Вы случайно не знаете? Есть ли существенные отличия от обычного файла?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
09.04.2020, 17:22
Цитата Сообщение от Electroflower Посмотреть сообщение
Это создает временный файл в папке прожекта
Очень странно, зачем он там, если есть специальная папка для временных файлов... Ну ладно, пусть будет там...

Нет, существенных отличий нет. Точно так же записывается информация в файл функцией WriteFile (ты ж не одновременно из нескольких потоков писать собираешься, а из одного - так какая разница, дополнительный это поток или основной?)
1
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
10.04.2020, 10:47  [ТС]
volvo, Доброе утро! Спасибо за вашу помощь, не могли бы вы еще подсказать по такому моменту.
Если я создаю файл в катлоге с проектом, то в него все прекрасно пишется из потока, если я его создаю в Темр папке то он создается но валится при записи в него, в чем может быть проблема? Вот код, тут я беру файл любой через опендиалог и пишу его в новый временный :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMemoryStream* memoryStream = new TMemoryStream();
HANDLE tempFile;
DWORD dwRetVal = 0;
TCHAR lpTempPathBuffer[MAX_PATH];
TCHAR szTempFileName[MAX_PATH];
UINT uRetVal   = 0;
 
 if(OpenDialog1->Execute())
                {
                memoryStream->LoadFromFile(OpenDialog1->FileName);//выбранный файл грузим в поток
                memoryStream->Position=NULL;
 
                //Ищем папку темпа
                dwRetVal = GetTempPath(MAX_PATH,// length of the buffer
                           lpTempPathBuffer); // buffer for path
 
                //  Generates a temporary file name. 
                uRetVal = GetTempFileName(lpTempPathBuffer, // directory for tmp files
                              TEXT("myTmp"),     // temp file name prefix
                              0,                // create unique name
                              szTempFileName);  // buffer for name
 
                Edit1->Text =szTempFileName;
                //креетим временный файл в путь который мы нашли и именем  которое задали
                tempFile = CreateFile((LPTSTR)szTempFileName,                                                 // имя файла
                                      GENERIC_WRITE |GENERIC_READ|GENERIC_EXECUTE,                              // режим доступа
                                      FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE ,                       // совместный доступ
                                      NULL,                                                     // SD (дескр. защиты)
                                      CREATE_ALWAYS,                                            // как действовать
                                      FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,     // атрибуты файла
                                      NULL                                                      // дескр.шаблона файла
                                      );
                if (tempFile==0) ShowMessage("0");
 
                AnsiString IniFileName=(LPTSTR)szTempFileName;//ExtractFilePath(szTempFileName);
                memoryStream->SaveToFile(IniFileName);
                //memoryStream->Clear();
                //tempFile->
 
                }
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
10.04.2020, 14:10
Смотри:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TMemoryStream* ms = new TMemoryStream();
    __try
    {
        TCHAR lpTempPathBuffer[MAX_PATH];
        TCHAR szTempFileName[MAX_PATH];
        UINT uRetVal = 0;
 
        if (OpenDialog1->Execute()) {
            ms->LoadFromFile(OpenDialog1->FileName);
            // выбранный файл грузим в поток
            // Ищем папку темпа
            DWORD dwRetVal = GetTempPath(MAX_PATH, lpTempPathBuffer);
            uRetVal = GetTempFileName(lpTempPathBuffer,
                // directory for tmp files
                TEXT("myTmp"), // temp file name prefix
                0, // create unique name
                szTempFileName); // buffer for name
 
            Edit1->Text = szTempFileName;
            // креетим временный файл в путь который мы нашли и именем  которое задали
            HANDLE tempFile = CreateFile((LPTSTR)szTempFileName, // имя файла
                GENERIC_WRITE | GENERIC_READ | GENERIC_EXECUTE, // режим доступа
                FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
                // совместный доступ
                NULL, // SD (дескр. защиты)
                CREATE_ALWAYS, // как действовать
                FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,
                // атрибуты файла
                NULL // дескр.шаблона файла
                );
            if (tempFile == INVALID_HANDLE_VALUE)
                ShowMessage("0");
 
            THandleStream *hs = new THandleStream((int)tempFile);
            __try
            {
                hs->CopyFrom(ms, ms->Size); // пишем из MemoryStream-а во временный файл, ничего не вылетает...
 
                // тут работаем с hs, как с обычным TFileStream
            }
            __finally
            {
                FileClose((int)tempFile);
                delete hs; // всё, временный файл удален
            }
        }
    }
    __finally
    {
        delete ms;
    }
}
Добавлено через 30 минут
А можно пойти еще дальше, и сделать вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Пишем класс, который сам будет при создании кземпляра создавать временный файл, 
// а при удалении экземпляра - удалять его хендл, при этом временный файл будет удаляться автоматически
class TTempStream : public THandleStream
{
    HANDLE tempFile;
 
    int CreateTF()
    {
        TCHAR lpTempPathBuffer[MAX_PATH];
        TCHAR szTempFileName[MAX_PATH];
        UINT uRetVal = 0;
 
        // Ищем папку темпа
        DWORD dwRetVal = GetTempPath(MAX_PATH, lpTempPathBuffer);
        uRetVal = GetTempFileName(lpTempPathBuffer, // directory for tmp files
            TEXT("myTmp"), // temp file name prefix
            0, // create unique name
            szTempFileName); // buffer for name
 
        // креетим временный файл в путь который мы нашли и именем  которое задали
        tempFile = CreateFile((LPTSTR)szTempFileName, // имя файла
            GENERIC_WRITE | GENERIC_READ | GENERIC_EXECUTE, // режим доступа
            FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, // совместный доступ
            NULL, // SD (дескр. защиты)
            CREATE_ALWAYS, // как действовать
            FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, // атрибуты файла
            NULL // дескр.шаблона файла
            );
        if (tempFile == INVALID_HANDLE_VALUE)
        {
            ShowMessage("Error creating temp file");
        }
 
        return (int)tempFile;
    }
 
public:
    __fastcall TTempStream() : THandleStream( CreateTF() )
    {
    }
 
    __fastcall virtual ~TTempStream(void)
    {
        FileClose((int)tempFile);
    }
};
 
// Собственно, теперь работать с временными файлами гораздо проще:
void __fastcall TFormStart::Button1Click(TObject *Sender)
{
    TMemoryStream* ms = new TMemoryStream();
    __try
    {
 
        if (OpenDialog1->Execute())
        {
            ms->LoadFromFile(OpenDialog1->FileName);
            // выбранный файл грузим в поток
 
            TTempStream *ts = new TTempStream(); // при этом будет создан файл в папке TMP
            __try
            {
                ts->CopyFrom(ms, ms->Size); // копируем в него всё, что есть в MemoryStream-е
 
                // тут работаем с ts, как с обычным TFileStream
            }
            __finally
            {
                delete ts; // всё, временный файл удален
            }
        }
    }
    __finally 
    {
        delete ms;
    }
}
2
Shiningemerald
 Аватар для Electroflower
384 / 117 / 22
Регистрация: 05.01.2012
Сообщений: 951
13.04.2020, 08:46  [ТС]
volvo, спасибо большое за помощь! Буду разбираться)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.04.2020, 08:46
Помогаю со студенческими работами здесь

Настроить VS на создание временного проекта
Всем привет, может кто подскажет как настроить VS на создание временного проекта (как в предыдущих версиях) вместо указания пути для...

Создание временного сервера на своем пк
Можно ли написать программу, которая в момент запуска или соединения с другим клиентом будет создавать временный сервер на ПК для передачи...

Создание временного диска в оперативной памяти
Здравствуйте, коллеги. Вопрос на засыпку: возможно ли средствами VB.NET создать временный диск / каталог в оперативке? Что...

Использование временного файла. Ошибка!
Что здесь делаю не так? Нужно, чтобы прога убирала табуляцию и сохраняла в том же файле, из которого взяла текст. FILE *in,*tmp; ...

Обновление Nod32 (ошибка создания временного файла)
Уважаемые форумчане! Помогите пожалуйста в таком вопросе: При обновлении Nod32 выдает сообщение об ошибке создания временного файла ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru