Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
6 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 43
1

Создание файла из службы Windows

20.05.2013, 15:14. Просмотров 2255. Ответов 8
Метки нет (Все метки)


C++
1
2
3
4
5
6
7
8
9
10
#include <fstream>
#include <iostream>
 
void __fastcall TWorkThread::Execute()
{
ofstream out((Directory + "\\errTime.txt").c_str());
if (!out) return;
out<<(DateTimeToStr(Now())).c_str()<<endl;
out.close();
}
Создана служба Windows, в ней запускается поток, в котором в том числе происходит запись 1 строки файл. Проблема собственно, в том что иногда процентов в 5% или меньше файл по нормальному не создается, а именно не хватает букв в расширении. например errTime.t или errTime.tх, бывает что errTime.0. С чем это может быть связано и как решить такую проблему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2013, 15:14
Ответы с готовыми решениями:

Создание Windows-службы
Здравствуйте уважаемые! Мне необходимо создать (желательно с помощью API, хотя не обязательно)...

Создание службы Windows
Добрый день. Есть работающая консоль public class PsiActivityCheck { public...

Создание Службы Windows
Добрый день, с С++ не знаком вообще, стоит задача написать несколько служб на нем, до этого писал...

Создание и запуск службы Windows
Помогите разобраться с созданием и запуском службы Windows. К примеру: у меня есть библиотека...

8
4030 / 2320 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
20.05.2013, 17:25 2
Попробуй работать вин-апи средствами - CreateFile() и далее по тексту...
0
6 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 43
21.05.2013, 10:56  [ТС] 3
Да я думал, о CreateFile.
но вот еще момент, у меня в коде в заголовках все таки стоит #include <fstream.h>, а не #include <fstream>. в интернете прочитал, что fstream.h старая версия библиотеки, а fstream новая STL - вская. Может в этом причина?
0
4030 / 2320 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
21.05.2013, 14:42 4
Не попробовав - не узнаешь.
0
LK
Заблокирован
21.05.2013, 14:44 5
Anyway, you #include whatever filename the file has. The reason it's <iostream> and not <iostream.h> is because the file name is iostream. There's no .h on it. For whatever reason, the C++ standard lib headers have no extention.

As for <math.h>... that's a standard C (read: not C++) header. C headers had the .h.

C++ "adopted" some of the old C headers, but renamed them. They got rid of the .h at the end and prefixed it with a c. So instead of #include <math.h>, you would include <cmath>

<math.h> still works though because most /all C++ compilers are also C compilers and therefore come with both the C and C++ standard libraries.
When C++ was first created, all of the files in the standard runtime library ended in .h. Life was consistent, and it was good. The original version of cout and cin lived in iostream.h. When the language was standardized by the ANSI committee, they decided to move all of the functions in the runtime library into the std namespace (which is generally a good idea). However, this presented a problem: if they moved all the functions into the std namespace, none of the old programs would work any more!

To try to get around this issue and provide backwards compatibility for older programs, a new set of header files was introduced that use the same names but lack the .h extension. These new header files have all their functionality inside the std namespace. This way, older programs that include #include <iosteam.h> do not need to be rewritten, and newer programs can #include <iostream>.

Make sure when you include a header file from the standard library that you use the non .h version if it exists. Otherwise you will be using a deprecated version of the header that is no longer supported.
Т.е., по новому стандарту, STL включает весь функционал старой библиотеки, но при подключении требует не указывать расширение файла. Иначе говоря, #include <fstream.h> - это подключение "в стиле" С, а #include <fstream> - "в стиле" С++. В случае несоответствия стандарту, при подключении библотеки может возникнуть ошибка
fatal error C1083: Cannot open include file: "fstream.h": No such file or directory
Однако, многие современные компиляторы с целью обратной совместимости поддерживают подключение с указанием расширения файла.

И никто не запрещает вам поэкспериментировать с разными вариантами подключения библотеки.

Источники:
what different between #include <fstream.h> and no h
#include <fstream.h>
<iostream> vs. <iostream.h>
2
6 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 43
22.05.2013, 11:47  [ТС] 6
Заменил fstream функцию, на API CreateFile. Стало еще хуже создавать (то не дописывает, test.tx, tes0, то добавляет лишние знаки test.txt0, test.txt" ), радует только одно, что проблема возникает на нескольких машинах. Что может мешать нормальному созданию файла на конкретной машине, если на остальных нормально отрабатывает?
0
6 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 43
24.05.2013, 10:43  [ТС] 7
Создал новую службу в ней 2 потока, 1 читает файл другой пишет в него, чтение и запись в цикле 10 000. На проблемной машине кривых файлов не создается. Думаю что проблема не в синхронизации потоков. Но из основного сервиса, 5 файлов создать не могу без ошибки. Значит проблема в самом сервисе, а не в способе чтения-записи, но почему тогда на других компьютерах (90%) этот сервис отрабатывает?
0
4030 / 2320 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
24.05.2013, 19:31 8
Есть подозрение на некорректную работу временных объектов. Попробуй обойтись без них, где-то вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <fstream>
#include <iostream>
 
void __fastcall TWorkThread::Execute()
{
    String sfilename = Directory + "\\errTime.txt", stime;
    ofstream out( sfilename.c_str( ) );
    if ( ! out.is_open( ) ) return;
    
    stime = DateTimeToStr( Now( ) );
    out << stime.c_str( ) << endl;
    out.close();
}
1
6 / 6 / 1
Регистрация: 14.05.2013
Сообщений: 43
27.05.2013, 18:35  [ТС] 9
Есть подозрение на очень умного сисадмина, который при установке службы в инишке указал короткое имя папки, куда пишутся файлы
С:\\Progra~1\\...
Указал полное имя все как надо заработало
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2013, 18:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Создание windows-службы из готовой программы
Здравствуйте. подскажите пожалуйста как сделать виндовс службу. У меня есть уже готовый код...

Создание собственной Windows службы на java
Здравствуйте, хочу создать свою службу Windows, по примерам из интернета написал приложение...

Создание Службы Windows, делающей скрины и управляющей устройствами ввода
Всем добрый вечер! Не подскажите, необходимо сделать службу которая бы могла сделать скрин...

Как остановить две службы Windows в Windows 7
Нужно принудительно без запросов остановить эти две службы: Система событий COM+ (EventSystem)...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.