windows-nt/Source/XPSP1/NT/base/fs/utils/ulib/inc/fsnode.hxx

1049 lines
18 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
fsnode.hxx
Abstract:
This module contains the declaration for the FSNODE class. FSNODE stands
for File System NODE and is an abstract class for all user visible
objects that exist in a file system (e.g. files, directories).
Author:
David J. Gilman (davegi) 09-Jan-1991
Environment:
ULIB, User Mode
Notes:
Do not confuse this class or it's derived classes with the IFS class
sub-hierarchy. FSNODE related classes are user visible classes. They
are not intended to be used for low level file system tasks such as
format or chkdsk. FSNODE classes are as file system independent as the
underlying system allows.
--*/
#if ! defined( _FSNODE_ )
#define _FSNODE_
#include "path.hxx"
//
// Forward references
//
DECLARE_CLASS( ARRAY );
DECLARE_CLASS( FSN_DIRECTORY );
DECLARE_CLASS( FSNODE );
DECLARE_CLASS( TIMEINFO );
DECLARE_CLASS( WSTRING );
//
// Extend the set of system defined FILE_ATTRIBUTEs to include
//
// - all files (no directories)
// - all file and directories
//
#define FILE_ATTRIBUTE_FILES ( FILE_ATTRIBUTE_ARCHIVE | \
FILE_ATTRIBUTE_HIDDEN | \
FILE_ATTRIBUTE_NORMAL | \
FILE_ATTRIBUTE_READONLY | \
FILE_ATTRIBUTE_COMPRESSED | \
FILE_ATTRIBUTE_SYSTEM )
#define FILE_ATTRIBUTE_ALL ( FILE_ATTRIBUTE_FILES | \
FILE_ATTRIBUTE_DIRECTORY )
typedef ULONG FSN_ATTRIBUTE;
#define FSN_ATTRIBUTE_ARCHIVE FILE_ATTRIBUTE_ARCHIVE
#define FSN_ATTRIBUTE_DIRECTORY FILE_ATTRIBUTE_DIRECTORY
#define FSN_ATTRIBUTE_HIDDEN FILE_ATTRIBUTE_HIDDEN
#define FSN_ATTRIBUTE_NORMAL FILE_ATTRIBUTE_NORMAL
#define FSN_ATTRIBUTE_READONLY FILE_ATTRIBUTE_READONLY
#define FSN_ATTRIBUTE_COMPRESSED FILE_ATTRIBUTE_COMPRESSED
#define FSN_ATTRIBUTE_SYSTEM FILE_ATTRIBUTE_SYSTEM
#define FSN_ATTRIBUTE_FILES FILE_ATTRIBUTE_FILES
#define FSN_ATTRIBUTE_ALL FILE_ATTRIBUTE_ALL
//
// FSNODE time & date types
//
enum FSN_TIME {
FSN_TIME_MODIFIED = 0,
FSN_TIME_CREATED = 1,
FSN_TIME_ACCESSED = 2
};
class FSNODE : public OBJECT {
friend class FSN_FILTER;
public:
VIRTUAL
~FSNODE (
);
NONVIRTUAL
PCPATH
GetPath (
) CONST;
NONVIRTUAL
BOOLEAN
IsArchived (
) CONST;
NONVIRTUAL
BOOLEAN
IsDirectory (
) CONST;
NONVIRTUAL
BOOLEAN
IsHidden (
) CONST;
NONVIRTUAL
BOOLEAN
IsNormal (
) CONST;
NONVIRTUAL
BOOLEAN
IsReadOnly (
) CONST;
NONVIRTUAL
BOOLEAN
IsSystem (
) CONST;
NONVIRTUAL
BOOLEAN
IsEncrypted (
) CONST;
NONVIRTUAL
BOOLEAN
MakeArchived (
OUT LPDWORD Win32Error DEFAULT NULL
);
NONVIRTUAL
BOOLEAN
MakeHidden (
OUT LPDWORD Win32Error DEFAULT NULL
);
NONVIRTUAL
BOOLEAN
MakeNormal (
OUT LPDWORD Win32Error DEFAULT NULL
);
NONVIRTUAL
BOOLEAN
MakeReadOnly (
OUT LPDWORD Win32Error DEFAULT NULL
);
NONVIRTUAL
BOOLEAN
MakeSystem (
OUT LPDWORD Win32Error DEFAULT NULL
);
NONVIRTUAL
PWSTRING
QueryBase (
) CONST;
NONVIRTUAL
PWSTRING
QueryName (
) CONST;
VIRTUAL
PFSN_DIRECTORY
QueryParentDirectory (
) CONST;
VIRTUAL
PTIMEINFO
QueryTimeInfo (
IN FSN_TIME TimeInfoType DEFAULT FSN_TIME_MODIFIED
) CONST;
VIRTUAL
BOOLEAN
Rename(
IN PCPATH NewName
);
NONVIRTUAL
BOOLEAN
ResetArchivedAttribute (
OUT LPDWORD Win32Error DEFAULT NULL
);
NONVIRTUAL
BOOLEAN
ResetHiddenAttribute (
OUT LPDWORD Win32Error DEFAULT NULL
);
NONVIRTUAL
BOOLEAN
ResetReadOnlyAttribute (
OUT LPDWORD Win32Error DEFAULT NULL
);
NONVIRTUAL
BOOLEAN
ResetSystemAttribute (
OUT LPDWORD Win32Error DEFAULT NULL
);
VIRTUAL
BOOLEAN
SetTimeInfo (
IN PCTIMEINFO TimeInfo,
IN FSN_TIME TimeInfoType DEFAULT FSN_TIME_MODIFIED
);
VIRTUAL
BOOLEAN
DeleteFromDisk(
IN BOOLEAN Force DEFAULT FALSE
);
VIRTUAL
BOOLEAN
UpdateFsNode(
);
NONVIRTUAL
FSN_ATTRIBUTE
QueryAttributes(
) CONST;
NONVIRTUAL
BOOLEAN
SetAttributes (
IN FSN_ATTRIBUTE Attributes,
OUT LPDWORD Win32Error DEFAULT NULL
);
NONVIRTUAL
ULIB_EXPORT
BOOLEAN
UseAlternateName(
);
protected:
DECLARE_CONSTRUCTOR( FSNODE );
VIRTUAL
BOOLEAN
Initialize (
IN PCWSTR PathName,
IN PCFSN_DIRECTORY ParentDirectory,
IN PWIN32_FIND_DATA FileData
);
VIRTUAL
BOOLEAN
Initialize (
IN PCWSTRING PathName,
IN PWIN32_FIND_DATA FileData
);
NONVIRTUAL
PFILETIME
GetCreationTime(
);
NONVIRTUAL
PFILETIME
GetLastAccessTime(
);
NONVIRTUAL
PFILETIME
GetLastWriteTime(
);
PATH _Path;
WIN32_FIND_DATAW _FileData;
private:
};
INLINE
PCPATH
FSNODE::GetPath (
) CONST
/*++
Routine Description:
Return the contained PATH object.
Arguments:
None.
Return Value:
PCPATH - returns a constant pointer to the contained PATH object
--*/
{
return( &_Path );
}
INLINE
PFILETIME
FSNODE::GetCreationTime(
)
/*++
Routine Description:
Returns pointer to creation time.
Arguments:
None.
Return Value:
PFILETIME - pointer to creation time
--*/
{
return( &_FileData.ftCreationTime );
}
INLINE
PFILETIME
FSNODE::GetLastAccessTime(
)
/*++
Routine Description:
Returns pointer to last access time.
Arguments:
None.
Return Value:
PFILETIME - pointer to last access time
--*/
{
return( &_FileData.ftLastAccessTime );
}
INLINE
PFILETIME
FSNODE::GetLastWriteTime(
)
/*++
Routine Description:
Returns pointer to last write time.
Arguments:
None.
Return Value:
PFILETIME - pointer to last write time
--*/
{
return( &_FileData.ftLastWriteTime );
}
INLINE
BOOLEAN
FSNODE::IsArchived (
) CONST
/*++
Routine Description:
Determine if this FSNODE's archived attribute is set.
Arguments:
None.
Return Value:
BOOLEAN - Returns TRUE if this FSNODE's archived attribute is set.
--*/
{
return( ( _FileData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE ) != 0 );
}
INLINE
BOOLEAN
FSNODE::IsDirectory (
) CONST
/*++
Routine Description:
Determine if this FSNODE's directory attribute is set.
Arguments:
None.
Return Value:
BOOLEAN - Returns TRUE if this FSNODE's directory attribute is set.
--*/
{
return( ( _FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) != 0 );
}
INLINE
BOOLEAN
FSNODE::IsHidden (
) CONST
/*++
Routine Description:
Determine if this FSNODE's hidden attribute is set.
Arguments:
None.
Return Value:
BOOLEAN - Returns TRUE if this FSNODE's hidden attribute is set.
--*/
{
return( ( _FileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) != 0 );
}
INLINE
BOOLEAN
FSNODE::IsNormal (
) CONST
/*++
Routine Description:
Determine if this FSNODE's normal attribute is set.
Arguments:
None.
Return Value:
BOOLEAN - Returns TRUE if this FSNODE's normal attribute is set.
--*/
{
return( ( _FileData.dwFileAttributes & FILE_ATTRIBUTE_NORMAL ) != 0 );
}
INLINE
BOOLEAN
FSNODE::IsReadOnly (
) CONST
/*++
Routine Description:
Determine if this FSNODE's readonly attribute is set.
Arguments:
None.
Return Value:
BOOLEAN - Returns TRUE if this FSNODE's readonly attribute is set.
--*/
{
return( ( _FileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY ) != 0 );
}
INLINE
BOOLEAN
FSNODE::IsSystem (
) CONST
/*++
Routine Description:
Determine if this FSNODE's system attribute is set.
Arguments:
None.
Return Value:
BOOLEAN - Returns TRUE if this FSNODE's system attribute is set.
--*/
{
return( ( _FileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM ) != 0 );
}
INLINE
BOOLEAN
FSNODE::IsEncrypted (
) CONST
/*++
Routine Description:
Determine if this FSNODE's encrypted attribute is set.
Arguments:
None.
Return Value:
BOOLEAN - Returns TRUE if this FSNODE's encrypted attribute is set.
--*/
{
return( ( _FileData.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED ) != 0 );
}
INLINE
BOOLEAN
FSNODE::MakeArchived (
OUT LPDWORD Win32Error
)
/*++
Routine Description:
Make the underlying 'file' archived.
Arguments:
Win32Error - Optional parameter that will contain a Win32 error code
if the method is unable to change attribute.
Return Value:
BOOLEAN - Returns the result of setting the file's archived attribute.
--*/
{
if( SetFileAttributesW(( LPWSTR ) _FileData.cFileName,
_FileData.dwFileAttributes | FILE_ATTRIBUTE_ARCHIVE )) {
_FileData.dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE;
return( TRUE );
} else {
if( Win32Error != NULL ) {
*Win32Error = GetLastError();
}
return( FALSE );
}
}
INLINE
BOOLEAN
FSNODE::MakeHidden (
OUT LPDWORD Win32Error
)
/*++
Routine Description:
Make the underlying 'file' hidden.
Arguments:
Win32Error - Optional parameter that will contain a Win32 error code
if the method is unable to change attribute.
Return Value:
BOOLEAN - Returns the result of setting the file's hidden attribute.
--*/
{
if( SetFileAttributesW(( LPWSTR ) _FileData.cFileName,
_FileData.dwFileAttributes | FILE_ATTRIBUTE_HIDDEN )) {
_FileData.dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN;
return( TRUE );
} else {
if( Win32Error != NULL ) {
*Win32Error = GetLastError();
}
return( FALSE );
}
}
INLINE
BOOLEAN
FSNODE::MakeNormal (
OUT LPDWORD Win32Error
)
/*++
Routine Description:
Make the underlying 'file' normal.
Arguments:
Win32Error - Optional parameter that will contain a Win32 error code
if the method is unable to change attribute.
Return Value:
BOOLEAN - Returns the result of resetting all the file's resettable
attributes.
Note:
Making a 'file' normal means resetting all but the
FILE_ATTRIBUTE_DIRECTORY attributes.
--*/
{
if( SetFileAttributesW(( LPWSTR ) _FileData.cFileName,
FILE_ATTRIBUTE_NORMAL )) {
_FileData.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
return( TRUE );
} else {
if( Win32Error != NULL ) {
*Win32Error = GetLastError();
}
return( FALSE );
}
}
INLINE
BOOLEAN
FSNODE::MakeReadOnly (
OUT LPDWORD Win32Error
)
/*++
Routine Description:
Make the underlying 'file' read-only.
Arguments:
Win32Error - Optional parameter that will contain a Win32 error code
if the method is unable to change attribute.
Return Value:
BOOLEAN - Returns the result of setting the file's read-only attribute.
--*/
{
if( SetFileAttributesW(( LPWSTR ) _FileData.cFileName,
_FileData.dwFileAttributes | FILE_ATTRIBUTE_READONLY )) {
_FileData.dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
return( TRUE );
} else {
if( Win32Error != NULL ) {
*Win32Error = GetLastError();
}
return( FALSE );
}
}
INLINE
BOOLEAN
FSNODE::MakeSystem (
OUT LPDWORD Win32Error
)
/*++
Routine Description:
Make the underlying 'file' a system file.
Arguments:
Win32Error - Optional parameter that will contain a Win32 error code
if the method is unable to change attribute.
Return Value:
BOOLEAN - Returns the result of setting the file's system attribute.
--*/
{
if( SetFileAttributesW(( LPWSTR ) _FileData.cFileName,
_FileData.dwFileAttributes | FILE_ATTRIBUTE_SYSTEM )) {
_FileData.dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM;
return( TRUE );
} else {
if( Win32Error != NULL ) {
*Win32Error = GetLastError();
}
return( FALSE );
}
}
INLINE
PWSTRING
FSNODE::QueryBase (
) CONST
/*++
Routine Description:
Return the base name maintained by the contained PATH object.
Arguments:
None.
Return Value:
PWSTRING - Returns a pointer to the base name.
--*/
{
return( ((PFSNODE) this)->_Path.QueryBase( ));
}
INLINE
FSN_ATTRIBUTE
FSNODE::QueryAttributes (
) CONST
/*++
Routine Description:
Return the node's attributes
Arguments:
None.
Return Value:
FSN_ATTRIBUTE - The attributes
--*/
{
return( (FSN_ATTRIBUTE)_FileData.dwFileAttributes );
}
INLINE
PWSTRING
FSNODE::QueryName (
) CONST
/*++
Routine Description:
Return the name maintained by the contained PATH object.
Arguments:
None.
Return Value:
PWSTRING - Returns a pointer to the name.
--*/
{
return( ((PFSNODE) this)->_Path.QueryName( ));
}
INLINE
BOOLEAN
FSNODE::ResetArchivedAttribute (
OUT LPDWORD Win32Error
)
/*++
Routine Description:
Make the underlying 'file' non archived.
Arguments:
Win32Error - Optional parameter that will contain a Win32 error code
if the method is unable to change attribute.
Return Value:
BOOLEAN - Returns the result of resetting the file's archived attribute.
--*/
{
if( SetFileAttributesW(( LPWSTR ) _FileData.cFileName,
_FileData.dwFileAttributes & ~FILE_ATTRIBUTE_ARCHIVE )) {
_FileData.dwFileAttributes &= ~FILE_ATTRIBUTE_ARCHIVE;
return( TRUE );
} else {
if( Win32Error != NULL ) {
*Win32Error = GetLastError();
}
return( FALSE );
}
}
INLINE
BOOLEAN
FSNODE::ResetHiddenAttribute (
OUT LPDWORD Win32Error
)
/*++
Routine Description:
Make the underlying 'file' non-hidden.
Arguments:
Win32Error - Optional parameter that will contain a Win32 error code
if the method is unable to change attribute.
Return Value:
BOOLEAN - Returns the result of resetting the file's hidden attribute.
--*/
{
if( SetFileAttributesW(( LPWSTR ) _FileData.cFileName,
_FileData.dwFileAttributes & ~FILE_ATTRIBUTE_HIDDEN )) {
_FileData.dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;
return( TRUE );
} else {
if( Win32Error != NULL ) {
*Win32Error = GetLastError();
}
return( FALSE );
}
}
INLINE
BOOLEAN
FSNODE::ResetReadOnlyAttribute (
OUT LPDWORD Win32Error
)
/*++
Routine Description:
Make the underlying 'file' non-read-only.
Arguments:
Win32Error - Optional parameter that will contain a Win32 error code
if the method is unable to change attribute.
Return Value:
BOOLEAN - Returns the result of resetting the file's read-only attribute.
--*/
{
if( SetFileAttributesW(( LPWSTR ) _FileData.cFileName,
_FileData.dwFileAttributes & ~FILE_ATTRIBUTE_READONLY )) {
_FileData.dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
return( TRUE );
} else {
if( Win32Error != NULL ) {
*Win32Error = GetLastError();
}
return( FALSE );
}
}
INLINE
BOOLEAN
FSNODE::ResetSystemAttribute (
OUT LPDWORD Win32Error
)
/*++
Routine Description:
Make the underlying 'file' a non-system file.
Arguments:
Win32Error - Optional parameter that will contain a Win32 error code
if the method is unable to change attribute.
Return Value:
BOOLEAN - Returns the result of setting the file's system attribute.
--*/
{
if( SetFileAttributesW(( LPWSTR ) _FileData.cFileName,
_FileData.dwFileAttributes & ~FILE_ATTRIBUTE_SYSTEM )) {
_FileData.dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;
return( TRUE );
} else {
if( Win32Error != NULL ) {
*Win32Error = GetLastError();
}
return( FALSE );
}
}
INLINE
BOOLEAN
FSNODE::SetAttributes (
IN FSN_ATTRIBUTE Attributes,
OUT LPDWORD Win32Error
)
/*++
Routine Description:
Set the attributes of the underlying 'file'.
(This method was added to improve performance of attrib.exe).
Arguments:
Attributes - New attributes for the file.
Win32Error - Optional parameter that will contain a Win32 error code
if the method is unable to change attribute.
Return Value:
BOOLEAN - Returns the result of setting the file's system attribute.
--*/
{
if( SetFileAttributesW(( LPWSTR ) _FileData.cFileName,
(_FileData.dwFileAttributes & ~FILE_ATTRIBUTE_FILES) | Attributes )) {
_FileData.dwFileAttributes &= ~FILE_ATTRIBUTE_FILES;
_FileData.dwFileAttributes |= Attributes;
return( TRUE );
} else {
if( Win32Error != NULL ) {
*Win32Error = GetLastError();
}
return( FALSE );
}
}
#endif // _FSNODE_