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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
#include "stdafx.h"
#include "File.h"
#include "FileOutputStream.h"
//Creates a file output stream to write to the file represented by the specified File object. A new FileDescriptor object is
//created to represent this file connection.
//First, if there is a security manager, its checkWrite method is called with the path represented by the file argument as its argument.
//
//If the file exists but is a directory rather than a regular file, does not exist but cannot be created, or cannot be opened
//for any other reason then a FileNotFoundException is thrown.
//
//Parameters:
//file - the file to be opened for writing.
FileOutputStream::FileOutputStream(const File &file) : m_fileHandle( INVALID_HANDLE_VALUE )
{
if( file.exists() && file.isDirectory())
{
// TODO 4J Stu - FileNotFoundException
return;
}
#ifdef _DURANGO
m_fileHandle = CreateFile(
file.getPath().c_str() , // file name
GENERIC_WRITE, // access mode
0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but...
NULL, // Unused
OPEN_ALWAYS , // how to create
FILE_ATTRIBUTE_NORMAL , // file attributes
NULL // Unsupported
);
#else
m_fileHandle = CreateFile(
wstringtofilename(file.getPath()) , // file name
GENERIC_WRITE, // access mode
0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but...
NULL, // Unused
OPEN_ALWAYS , // how to create
FILE_ATTRIBUTE_NORMAL , // file attributes
NULL // Unsupported
);
#endif
if( m_fileHandle == INVALID_HANDLE_VALUE )
{
DWORD error = GetLastError();
// TODO 4J Stu - Any form of error/exception handling
}
}
FileOutputStream::~FileOutputStream()
{
if( m_fileHandle != INVALID_HANDLE_VALUE )
CloseHandle( m_fileHandle );
}
//Writes the specified byte to this file output stream. Implements the write method of OutputStream.
//Parameters:
//b - the byte to be written.
void FileOutputStream::write(unsigned int b)
{
DWORD numberOfBytesWritten;
byte value = (byte) b;
BOOL result = WriteFile(
m_fileHandle, // handle to file
&value, // data buffer
1, // number of bytes to write
&numberOfBytesWritten, // number of bytes written
NULL // overlapped buffer
);
if( result == 0 )
{
// TODO 4J Stu - Some kind of error handling
}
else if( numberOfBytesWritten == 0 )
{
// File pointer is past the end of the file
}
}
//Writes b.length bytes from the specified byte array to this file output stream.
//Parameters:
//b - the data.
void FileOutputStream::write(byteArray b)
{
DWORD numberOfBytesWritten;
BOOL result = WriteFile(
m_fileHandle, // handle to file
&b.data, // data buffer
b.length, // number of bytes to write
&numberOfBytesWritten, // number of bytes written
NULL // overlapped buffer
);
if( result == 0 )
{
// TODO 4J Stu - Some kind of error handling
}
else if( numberOfBytesWritten == 0 || numberOfBytesWritten != b.length )
{
// File pointer is past the end of the file
}
}
//Writes len bytes from the specified byte array starting at offset off to this file output stream.
//Parameters:
//b - the data.
//off - the start offset in the data.
//len - the number of bytes to write.
void FileOutputStream::write(byteArray b, unsigned int offset, unsigned int length)
{
// 4J Stu - We don't want to write any more than the array buffer holds
assert( length <= ( b.length - offset ) );
DWORD numberOfBytesWritten;
BOOL result = WriteFile(
m_fileHandle, // handle to file
&b[offset], // data buffer
length, // number of bytes to write
&numberOfBytesWritten, // number of bytes written
NULL // overlapped buffer
);
if( result == 0 )
{
// TODO 4J Stu - Some kind of error handling
}
else if( numberOfBytesWritten == 0 || numberOfBytesWritten != length )
{
// File pointer is past the end of the file
}
}
//
//Closes this file output stream and releases any system resources associated with this stream.
//This file output stream may no longer be used for writing bytes.
//If this stream has an associated channel then the channel is closed as well.
void FileOutputStream::close()
{
BOOL result = CloseHandle( m_fileHandle );
if( result == 0 )
{
// TODO 4J Stu - Some kind of error handling
}
// Stop the dtor from trying to close it again
m_fileHandle = INVALID_HANDLE_VALUE;
}
|