Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
mahara
mahara
Commits
480fa10b
Commit
480fa10b
authored
Dec 03, 2007
by
Nigel McNie
Browse files
Upgraded File_CSV to the latest (1.3.0). Fixes #1722.
parent
5799a487
Changes
2
Hide whitespace changes
Inline
Side-by-side
htdocs/lib/pear/File.php
View file @
480fa10b
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP Version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2003 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Authors: Richard Heyes <richard@php.net> |
// | Tal Peer <tal@php.net> |
// +----------------------------------------------------------------------+
/*
* Example 1:
* $stdin = File::readAll('php://stdin');
*
* Example 2:
* while ($data = File::read('/blaat/bar')) {
* // Code...
* }
*/
require_once
(
'PEAR.php'
);
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* The default number of bytes for reading
* @const FILE_DEFAULT_READSIZE
*/
define
(
'FILE_DEFAULT_READSIZE'
,
1024
,
true
);
* File
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category File
* @package File
* @author Richard Heyes <richard@php.net>
* @author Tal Peer <tal@php.net>
* @author Michael Wallner <mike@php.net>
* @copyright 2002-2005 The Authors
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: File.php,v 1.38 2007/03/24 16:38:56 dufuz Exp $
* @link http://pear.php.net/package/File
*/
/**
* Mode to use for reading from files
* @const FILE_MODE_READ
*/
define
(
'FILE_MODE_READ'
,
'rb'
,
true
);
* Requires PEAR
*/
require_once
'PEAR.php'
;
/**
* Mode to use for truncating files, then writing
* @const FILE_MODE_WRITE
*/
define
(
'FILE_MODE_WRITE'
,
'wb'
,
true
);
* The default number of bytes for reading
*/
if
(
!
defined
(
'FILE_DEFAULT_READSIZE'
))
{
define
(
'FILE_DEFAULT_READSIZE'
,
1024
,
true
);
}
/**
* The maximum number of bytes for reading lines
*/
if
(
!
defined
(
'FILE_MAX_LINE_READSIZE'
))
{
define
(
'FILE_MAX_LINE_READSIZE'
,
40960
,
true
);
}
/**
* Whether file locks should block
*/
if
(
!
defined
(
'FILE_LOCKS_BLOCK'
))
{
define
(
'FILE_LOCKS_BLOCK'
,
true
,
true
);
}
/**
* Mode to use for appending to files
* @const FILE_MODE_APPEND
*/
* Mode to use for reading from files
*/
define
(
'FILE_MODE_READ'
,
'rb'
,
true
);
/**
* Mode to use for truncating files, then writing
*/
define
(
'FILE_MODE_WRITE'
,
'wb'
,
true
);
/**
* Mode to use for appending to files
*/
define
(
'FILE_MODE_APPEND'
,
'ab'
,
true
);
/**
* Use this when a shared (read) lock is required
* @const FILE_LOCK_SHARED
*/
define
(
'FILE_LOCK_SHARED'
,
LOCK_SH
,
true
);
* Use this when a shared (read) lock is required
*/
define
(
'FILE_LOCK_SHARED'
,
LOCK_SH
|
(
FILE_LOCKS_BLOCK
?
0
:
LOCK_NB
),
true
);
/**
* Use this when an exclusive (write) lock is required
* @const FILE_LOCK_EXCLUSIVE
*/
define
(
'FILE_LOCK_EXCLUSIVE'
,
LOCK_EX
,
true
);
* Use this when an exclusive (write) lock is required
*/
define
(
'FILE_LOCK_EXCLUSIVE'
,
LOCK_EX
|
(
FILE_LOCKS_BLOCK
?
0
:
LOCK_NB
),
true
);
/**
* Class for handling files
*
* A class with common functions for writing,
* reading and handling files and directories
*
*
* @author Richard Heyes <richard@php.net>
* @author Tal Peer <tal@php.net>
* @access public
* @version 0.9
* @package File
*/
* Class for handling files
*
* A class with common functions for writing,
* reading and handling files and directories
*
* @author Richard Heyes <richard@php.net>
* @author Tal Peer <tal@php.net>
* @author Michael Wallner <mike@php.net>
* @access public
* @package File
*
* @static
*/
class
File
extends
PEAR
{
/**
* Destructor
*
* Unlocks any locked file pointers and closes all filepointers
* @access private
*/
* Destructor
*
* Unlocks any locked file pointers and closes all filepointers
*
* @access private
*/
function
_File
()
{
$locks
=
&
PEAR
::
getStaticProperty
(
'File'
,
'locks'
);
$filePointers
=
&
PEAR
::
getStaticProperty
(
'File'
,
'filePointers'
);
for
(
$i
=
0
;
$i
<
count
(
$locks
);
$i
++
)
{
flock
(
$this
->
locks
[
$i
],
LOCK_UN
);
}
if
(
!
empty
(
$filePointers
))
{
foreach
(
$filePointers
as
$fname
=>
$value
)
{
foreach
(
$value
as
$mode
=>
$value
)
{
@
fclose
(
$filePointers
[
$fname
][
$mode
]);
}
}
}
File
::
closeAll
();
}
/**
* Handles file pointers. If a file pointer needs to be opened,
* it will be. If it already exists (based on filename and mode)
* then the existing one will be returned.
*
* @access private
* @param string $filename Filename to be used
* @param string $mode
Mode to open the file in
* @param mixed $lock
Type of lock to use
* @return mixed
PEAR_Error on error
and
file pointer resource on success
*/
function
&
_getFilePointer
(
$filename
,
$mode
,
$lock
=
false
)
* Handles file pointers. If a file pointer needs to be opened,
* it will be. If it already exists (based on filename and mode)
* then the existing one will be returned.
*
* @access
private
* @param
string $filename Filename to be used
* @param
string $mode Mode to open the file in
* @param
mixed $lock Type of lock to use
* @return
mixed PEAR_Error on error
or
file pointer resource on success
*/
function
_getFilePointer
(
$filename
,
$mode
,
$lock
=
false
)
{
$filePointers
=
&
PEAR
::
getStaticProperty
(
'File'
,
'filePointers'
);
// Need to open first...
if
(
!
isset
(
$filePointers
[
$filename
][
$mode
])
OR
!
is_resource
(
$filePointers
[
$filename
][
$mode
]))
{
// Check it exists
if
(
FILE_MODE_READ
==
$mode
AND
!
preg_match
(
'/^(http|https|ftp|php):\/\//i'
,
$filename
)
AND
!
file_exists
(
$filename
))
{
return
PEAR
::
raiseError
(
'File does not exist: '
.
$filename
);
// Writeable?
}
elseif
(
(
FILE_MODE_WRITE
==
$mode
OR
FILE_MODE_APPEND
==
$mode
)
AND
!
file_exists
(
$filename
)
AND
!
is_writeable
(
dirname
(
$filename
)))
{
return
PEAR
::
raiseError
(
'Could not create file: '
.
$filename
);
}
elseif
(
(
FILE_MODE_WRITE
==
$mode
OR
FILE_MODE_APPEND
==
$mode
)
AND
!
is_writeable
(
dirname
(
$filename
)))
{
// Win32 is case-insensitive
if
(
OS_WINDOWS
)
{
$filename
=
strtolower
(
$filename
);
}
return
PEAR
::
raiseError
(
'File is not writeable: '
.
$filename
);
// check if file pointer already exists
if
(
!
isset
(
$filePointers
[
$filename
][
$mode
])
||
!
is_resource
(
$filePointers
[
$filename
][
$mode
]))
{
// check if we can open the file in the desired mode
switch
(
$mode
)
{
case
FILE_MODE_READ
:
if
(
!
preg_match
(
'/^.+(?<!file):\/\//i'
,
$filename
)
&&
!
file_exists
(
$filename
))
{
return
PEAR
::
raiseError
(
"File does not exist:
$filename
"
);
}
break
;
case
FILE_MODE_APPEND
:
case
FILE_MODE_WRITE
:
if
(
file_exists
(
$filename
))
{
if
(
!
is_writable
(
$filename
))
{
return
PEAR
::
raiseError
(
"File is not writable:
$filename
"
);
}
}
elseif
(
!
is_writable
(
$dir
=
dirname
(
$filename
)))
{
return
PEAR
::
raiseError
(
"Cannot create file in directory:
$dir
"
);
}
break
;
default
:
return
PEAR
::
raiseError
(
"Invalid access mode:
$mode
"
);
}
// open file
$filePointers
[
$filename
][
$mode
]
=
@
fopen
(
$filename
,
$mode
);
if
(
false
===
$filePointers
[
$filename
][
$mode
])
{
if
(
!
is_resource
(
$filePointers
[
$filename
][
$mode
])
)
{
return
PEAR
::
raiseError
(
'Failed to open file: '
.
$filename
);
}
}
//
L
ock
it?
//
l
ock
file
if
(
$lock
)
{
$lock
=
$mode
==
FILE_MODE_READ
?
FILE_LOCK_SHARED
:
FILE_LOCK_EXCLUSIVE
;
$locks
=
&
PEAR
::
getStaticProperty
(
'File'
,
'locks'
);
if
(
flock
(
$filePointers
[
$filename
][
$mode
],
$lock
))
{
$this
->
locks
[]
=
&
$filePointers
[
$filename
][
$mode
];
if
(
@
flock
(
$filePointers
[
$filename
][
$mode
],
$lock
))
{
$locks
[]
=
&
$filePointers
[
$filename
][
$mode
];
}
elseif
(
FILE_LOCKS_BLOCK
)
{
return
PEAR
::
raiseError
(
"File already locked:
$filename
"
);
}
else
{
return
PEAR
::
raiseError
(
"Could not lock file:
$filename
"
);
}
}
return
$filePointers
[
$filename
][
$mode
];
}
/**
* Reads an entire file and returns it.
*
* @access public
* @param string $filename Name of file to read from
* @param mixed $lock Type of lock to use
* @return mixed PEAR_Error if an error has occured or a string with the contents of the the file
*/
* Reads an entire file and returns it.
* Uses file_get_contents if available.
*
* @access public
* @param string $filename Name of file to read from
* @param mixed $lock Type of lock to use
* @return mixed PEAR_Error if an error has occured or a string with the contents of the the file
*/
function
readAll
(
$filename
,
$lock
=
false
)
{
$file
=
''
;
while
((
$tmp
=
File
::
read
(
$filename
,
FILE_DEFAULT_READSIZE
,
$lock
))
!==
FALSE
)
{
if
(
PEAR
::
isError
(
$tmp
))
{
return
$tmp
;
}
$file
.
=
$tmp
;
if
(
false
===
$file
=
@
file_get_contents
(
$filename
))
{
return
PEAR
::
raiseError
(
"Cannot read file:
$filename
"
);
}
return
$file
;
}
/**
* Returns a specified number of bytes of a file. Defaults to 1024.
*
* @access public
* @param string $filename Name of file to read from
* @param integer $size Bytes to read
* @param mixed $lock Type of lock to use
* @return mixed PEAR_Error on error or a string which contains the data read
* Will also return false upon EOF
*/
* Returns a specified number of bytes of a file.
* Defaults to FILE_DEFAULT_READSIZE. If $size is 0, all file will be read.
*
* @access public
* @param string $filename Name of file to read from
* @param integer $size Bytes to read
* @param mixed $lock Type of lock to use
* @return mixed PEAR_Error on error or a string which contains the data read
* Will also return false upon EOF
*/
function
read
(
$filename
,
$size
=
FILE_DEFAULT_READSIZE
,
$lock
=
false
)
{
static
$filePointers
;
// Used to prevent unnecessary calls to _getFilePointer()
static
$filePointers
;
if
(
0
==
$size
)
{
return
File
::
readAll
(
$filename
);
if
(
$size
==
0
)
{
return
File
::
readAll
(
$filename
,
$lock
);
}
if
(
!
isset
(
$filePointers
[
$filename
])
OR
!
is_resource
(
$filePointers
[
$filename
]))
{
if
(
PEAR
::
isError
(
$fp
=
&
File
::
_getFilePointer
(
$filename
,
FILE_MODE_READ
,
$lock
)))
{
if
(
!
isset
(
$filePointers
[
$filename
])
||
!
is_resource
(
$filePointers
[
$filename
]))
{
$fp
=
File
::
_getFilePointer
(
$filename
,
FILE_MODE_READ
,
$lock
);
if
(
PEAR
::
isError
(
$fp
))
{
return
$fp
;
}
$filePointers
[
$filename
]
=
&
$fp
;
$filePointers
[
$filename
]
=
$fp
;
}
else
{
$fp
=
&
$filePointers
[
$filename
];
$fp
=
$filePointers
[
$filename
];
}
return
!
feof
(
$fp
)
?
fread
(
$fp
,
$size
)
:
false
;
}
/**
* Writes the given data to the given filename. Defaults to no lock, append mode.
*
* @access public
* @param string $filename Name of file to write to
* @param string $data Data to write to file
* @param string $mode Mode to open file in
* @param mixed $lock Type of lock to use
* @return mixed PEAR_Error on error or number of bytes written to file.
*/
* Writes the given data to the given filename.
* Defaults to no lock, append mode.
*
* @access public
* @param string $filename Name of file to write to
* @param string $data Data to write to file
* @param string $mode Mode to open file in
* @param mixed $lock Type of lock to use
* @return mixed PEAR_Error on error or number of bytes written to file.
*/
function
write
(
$filename
,
$data
,
$mode
=
FILE_MODE_APPEND
,
$lock
=
false
)
{
if
(
!
PEAR
::
isError
(
$fp
=
&
File
::
_getFilePointer
(
$filename
,
$mode
,
$lock
)))
{
if
((
$bytes
=
fwrite
(
$fp
,
$data
,
strlen
(
$data
)))
==
-
1
)
{
return
PEAR
::
raiseError
(
sprintf
(
'fwrite() call failed to write data: "%s" to file: "%s"'
,
$data
,
$filename
));
}
else
{
return
$bytes
;
}
$fp
=
File
::
_getFilePointer
(
$filename
,
$mode
,
$lock
);
if
(
PEAR
::
isError
(
$fp
))
{
return
$fp
;
}
return
$fp
;
if
(
false
===
$bytes
=
@
fwrite
(
$fp
,
$data
,
strlen
(
$data
)))
{
return
PEAR
::
raiseError
(
"Cannot write data: '
$data
' to file: '
$filename
'"
);
}
return
$bytes
;
}
/**
* Reads and returns a single character from given filename
*
* @access public
* @param string $filename Name of file to read from
* @param mixed $lock
Type of lock to use
* @return mixed
PEAR_Error on error or one character of the specified file
*/
* Reads and returns a single character from given filename
*
* @access
public
* @param
string
$filename Name of file to read from
* @param
mixed
$lock Type of lock to use
* @return
mixed PEAR_Error on error or one character of the specified file
*/
function
readChar
(
$filename
,
$lock
=
false
)
{
return
File
::
read
(
$filename
,
1
,
$lock
);
}
/**
* Writes a single character to a file
*
* @access public
* @param string $filename Name of file to write to
* @param string $char
Character to write
* @param string $mode
Mode to use when writing
* @param mixed $lock
Type of lock to use
* @return mixed
PEAR_Error on error, or 1 on success
*/
* Writes a single character to a file
*
* @access
public
* @param
string
$filename Name of file to write to
* @param
string
$char Character to write
* @param
string
$mode Mode to use when writing
* @param
mixed
$lock Type of lock to use
* @return
mixed PEAR_Error on error, or 1 on success
*/
function
writeChar
(
$filename
,
$char
,
$mode
=
FILE_MODE_APPEND
,
$lock
=
false
)
{
if
(
!
PEAR
::
isError
(
$fp
=
&
File
::
_getFilePointer
(
$filename
,
$mode
,
$lock
)))
{
if
(
fwrite
(
$fp
,
$char
,
1
)
==
-
1
)
{
return
PEAR
::
raiseError
(
sprintf
(
'fwrite() call failed to write data: "%s" to file: "%s"'
,
$data
,
$filename
));
}
else
{
return
1
;
}
$fp
=
File
::
_getFilePointer
(
$filename
,
$mode
,
$lock
);
if
(
PEAR
::
isError
(
$fp
))
{
return
$fp
;
}
if
(
false
===
@
fwrite
(
$fp
,
$char
,
1
))
{
return
PEAR
::
raiseError
(
"Cannot write data: '
$data
' to file: '
$filename
'"
);
}
return
$fp
;
return
1
;
}
/**
* Returns a line of the file
*
* @access public
* @param string $filename Name of file to read from
* @param boolean $lock Type of lock to use
* @return mixed PEAR_Error on error or a string containing the line read from file
*/
* Returns a line of the file (without trailing CRLF).
* Maximum read line length is FILE_MAX_LINE_READSIZE.
*
* @access public
* @param string $filename Name of file to read from
* @param boolean $lock Whether file should be locked
* @return mixed PEAR_Error on error or a string containing the line read from file
*/
function
readLine
(
$filename
,
$lock
=
false
)
{
static
$filePointers
;
// Used to prevent unnecessary calls to _getFilePointer()
if
(
!
isset
(
$filePointers
[
$filename
])
OR
!
is_resource
(
$filePointers
[
$filename
]))
{
if
(
PEAR
::
isError
(
$fp
=
&
File
::
_getFilePointer
(
$filename
,
FILE_MODE_READ
,
$lock
)))
{
if
(
!
isset
(
$filePointers
[
$filename
])
||
!
is_resource
(
$filePointers
[
$filename
]))
{
$fp
=
File
::
_getFilePointer
(
$filename
,
FILE_MODE_READ
,
$lock
);
if
(
PEAR
::
isError
(
$fp
))
{
return
$fp
;
}
$filePointers
[
$filename
]
=
&
$fp
;
$filePointers
[
$filename
]
=
$fp
;
}
else
{
$fp
=
&
$filePointers
[
$filename
];
$fp
=
$filePointers
[
$filename
];
}
if
(
feof
(
$fp
))
{
return
false
;
}
$fileString
=
''
;
while
((
$fileChar
=
fgetc
(
$fp
))
!=
"
\n
"
AND
!
feof
(
$fp
))
{
$fileString
.
=
$fileChar
;
if
(
feof
(
$fp
))
{
return
false
;
}
return
substr
(
$fileString
,
-
1
)
==
"
\r
"
?
substr
(
$fileString
,
0
,
-
1
)
:
$fileString
;
return
rtrim
(
fgets
(
$fp
,
FILE_MAX_LINE_READSIZE
),
"
\r\n
"
)
;
}
/**
* Writes a single line, appending a LF (by default)
*
* @access public
* @param string $filename Name of file to write to
* @param string $line
Line of data to be written to file
* @param string $mode
Write mode, can be either FILE_MODE_WRITE or FILE_MODE_APPEND
* @param string $crlf
The CRLF your system is using. UNIX = \n Windows = \r\n Mac = \r
* @param mixed $lock
Type of
lock t
o us
e
* @return mixed
PEAR_Error on error or number of bytes written to file (including appended crlf)
*/
* Writes a single line, appending a LF (by default)
*
* @access
public
* @param
string
$filename Name of file to write to
* @param
string
$line Line of data to be written to file
* @param
string
$mode Write mode, can be either FILE_MODE_WRITE or FILE_MODE_APPEND
* @param
string
$crlf The CRLF your system is using. UNIX = \n Windows = \r\n Mac = \r
* @param
mixed
$lock
Whether to
lock t
he fil
e
* @return
mixed PEAR_Error on error or number of bytes written to file (including appended crlf)
*/
function
writeLine
(
$filename
,
$line
,
$mode
=
FILE_MODE_APPEND
,
$crlf
=
"
\n
"
,
$lock
=
false
)
{
if
(
!
PEAR
::
isError
(
$fp
=
&
File
::
_getFilePointer
(
$filename
,
$mode
,
$lock
))){
if
((
$bytes
=
fwrite
(
$fp
,
$line
.
$crlf
))
==
-
1
)
{
return
PEAR
::
raiseError
(
sprintf
(
'fwrite() call failed to write data: "%s" to file: "%s"'
,
$data
,
$filename
));
}
else
{
return
$bytes
;
}
$fp
=
File
::
_getFilePointer
(
$filename
,
$mode
,
$lock
);
if
(
PEAR
::
isError
(
$fp
))
{
return
$fp
;
}
if
(
false
===
$bytes
=
fwrite
(
$fp
,
$line
.
$crlf
))
{
return
PEAR
::
raiseError
(
"Cannot write data: '
$data
' to file: '
$file
'"
);
}
return
$
fp
;
return
$
bytes
;
}
/**
* This rewinds a filepointer to the start of a file
*
* @access public
* @param string $filename The filename
* @param string $mode
Mode the file was opened in
* @return mixed
PEAR Error on error, true on success
*/
* This rewinds a filepointer to the start of a file
*
* @access
public
* @param
string
$filename The filename
* @param
string
$mode Mode the file was opened in
* @return
mixed PEAR Error on error, true on success
*/
function
rewind
(
$filename
,
$mode
)
{
if
(
!
PEAR
::
isError
(
$fp
=
&
File
::
_getFilePointer
(
$filename
,
$mode
)))
{
return
rewind
(
$fp
)
?
true
:
PEAR
::
raiseError
(
'Failed to rewind file: '
.
$filename
);
$fp
=
File
::
_getFilePointer
(
$filename
,
$mode
);
if
(
PEAR
::
isError
(
$fp
))
{
return
$fp
;
}
return
$fp
;
if
(
!@
rewind
(
$fp
))
{
return
PEAR
::
raiseError
(
"Cannot rewind file:
$filename
"
);
}
return
true
;
}
/**
* This closes an open file pointer
*
* @access public
* @param string $filename The filename that was opened
* @param string $mode Mode the file was opened in
* @return mixed PEAR Error on error, true otherwise
*/
function
close
(
$filename
,
$mode
)
* Closes all open file pointers
*
* @access public
* @return void
*/
function
closeAll
()
{
if
(
!
PEAR
::
isError
(
$fp
=
&
File
::
_getFilePointer
(
$filename
,
$mode
)))
{
$filePointers
=
&
PEAR
::
getStaticProperty
(
'File'
,
'filePointers'
);