source: XMLIO_V2/external/src/POCO/Foundation/LogFile_WIN32.hpp @ 80

Last change on this file since 80 was 80, checked in by ymipsl, 14 years ago

ajout lib externe

File size: 3.7 KB
Line 
1//
2// LogFile_WIN32.cpp
3//
4// $Id: //poco/1.3/Foundation/src/LogFile_WIN32.cpp#3 $
5//
6// Library: Foundation
7// Package: Logging
8// Module:  LogFile
9//
10// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
11// and Contributors.
12//
13// Permission is hereby granted, free of charge, to any person or organization
14// obtaining a copy of the software and accompanying documentation covered by
15// this license (the "Software") to use, reproduce, display, distribute,
16// execute, and transmit the Software, and to prepare derivative works of the
17// Software, and to permit third-parties to whom the Software is furnished to
18// do so, all subject to the following:
19//
20// The copyright notices in the Software and this entire statement, including
21// the above license grant, this restriction and the following disclaimer,
22// must be included in all copies of the Software, in whole or in part, and
23// all derivative works of the Software, unless such copies or derivative
24// works are solely in the form of machine-executable object code generated by
25// a source language processor.
26//
27// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
28// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
29// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
30// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
31// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
32// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
33// DEALINGS IN THE SOFTWARE.
34//
35
36
37#include <Poco/LogFile_WIN32.h>
38#include <Poco/File.h>
39#include <Poco/Exception.h>
40
41
42namespace Poco {
43
44
45LogFileImpl::LogFileImpl(const std::string& path): _path(path), _hFile(INVALID_HANDLE_VALUE)
46{
47        File file(path);
48        if (file.exists())
49        {
50                if (0 == sizeImpl())
51                        _creationDate = file.getLastModified();
52                else
53                        _creationDate = file.created();
54        }
55}
56
57
58LogFileImpl::~LogFileImpl()
59{
60        CloseHandle(_hFile);
61}
62
63
64void LogFileImpl::writeImpl(const std::string& text)
65{
66        if (INVALID_HANDLE_VALUE == _hFile)     createFile();
67
68        DWORD bytesWritten;
69        BOOL res = WriteFile(_hFile, text.data(), (DWORD) text.size(), &bytesWritten, NULL);
70        if (!res) throw WriteFileException(_path);
71        res = WriteFile(_hFile, "\r\n", 2, &bytesWritten, NULL);
72        if (!res) throw WriteFileException(_path);
73        res = FlushFileBuffers(_hFile);
74        if (!res) throw WriteFileException(_path);
75}
76
77
78UInt64 LogFileImpl::sizeImpl() const
79{
80        if (INVALID_HANDLE_VALUE == _hFile)
81        {
82                File file(_path);
83                if (file.exists()) return file.getSize();
84                else return 0;
85        }
86
87        LARGE_INTEGER li;
88        li.HighPart = 0;
89        li.LowPart  = SetFilePointer(_hFile, 0, &li.HighPart, FILE_CURRENT);
90        return li.QuadPart;
91}
92
93
94Timestamp LogFileImpl::creationDateImpl() const
95{
96        return _creationDate;
97}
98
99
100const std::string& LogFileImpl::pathImpl() const
101{
102        return _path;
103}
104
105
106void LogFileImpl::createFile()
107{
108        _hFile = CreateFileA(_path.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
109        if (_hFile == INVALID_HANDLE_VALUE) throw OpenFileException(_path);
110        SetFilePointer(_hFile, 0, 0, FILE_END);
111        // There seems to be a strange "optimization" in the Windows NTFS
112        // filesystem that causes it to reuse directory entries of deleted
113        // files. Example:
114        // 1. create a file named "test.dat"
115        //    note the file's creation date
116        // 2. delete the file "test.dat"
117        // 3. wait a few seconds
118        // 4. create a file named "test.dat"
119        //    the new file will have the same creation
120        //    date as the old one.
121        // We work around this bug by taking the file's
122        // modification date as a reference when the
123        // file is empty.
124        if (sizeImpl() == 0)
125                _creationDate = File(_path).getLastModified();
126        else
127                _creationDate = File(_path).created();
128}
129
130} // namespace Poco
Note: See TracBrowser for help on using the repository browser.