You Are Here:

Community: Wiki

This page was last modified on 9 September 2009, at 16:01.

Directory Monitoring

From Forum Nokia Wiki

Reviewer Approved   

This code is to monitor for file changes (added, erased) in a particular directory.

ID   Creation date March 12, 2008
Platform S60 3rd Edition S60 3rd Edition, FP1 Tested on devices N73
Category Symbian C++ Subcategory File/Data


Keywords (APIs, classes, methods, functions):


Contents

Overview

This code shows how to monitor for file changes (added/erased) in a particular directory. There is also an application showing how to use the code Source Code

This snippet can be self-signed.

MMP file (optional)

The following capabilities and libraries are required:

CAPABILITY ReadUserData


Libraries needed

LIBRARY  euser.lib //RTimer, CActive

Header file

/*
============================================================================
Name : DirectoryMonitor.h
Author  : Olympio Cipriano
Version  : 1.0
Copyright  :
Description : CDirectoryMonitor declaration
============================================================================
*/

 
#ifndef CDirectoryMonitor_H
#define CDirectoryMonitor_H
 
#include <e32base.h> // For CActive, link against: euser.lib
#include <e32std.h> // For RTimer, link against: euser.lib
#include <f32file.h>
 
enum TFileAction
{
EFileErased,
EFileAdded
};
 
class DirectoryObserver
{
public:
virtual void DirectoryChanged( const TDesC& aFileName, TFileAction aAction ) = 0;
};
 
class CDirectoryMonitor : public CActive
{
public:
// Cancel and destroy
~CDirectoryMonitor();
 
// Two-phased constructor.
static CDirectoryMonitor* NewL( DirectoryObserver * iObserver );
 
// Two-phased constructor.
static CDirectoryMonitor* NewLC(DirectoryObserver * iObserver );
 
 
public:
 
// New functions
// Function for making the initial request
void Monitor( const TDesC& aDirPath );
 
private:
// C++ constructor
CDirectoryMonitor( DirectoryObserver* aObserver );
 
// Second-phase constructor
void ConstructL();
 
//directory internals
void ListFiles( CDir*& aDir );
 
void DiffDirectoryContents( );
 
bool SearchEntry( const TEntry& aEntry, CDir* aDir );
 
void Clean();
 
private:
// From CActive
// Handle completion
void RunL();
 
// How to cancel me
void DoCancel();
 
// Override to handle leaves from RunL(). Default implementation causes
// the active scheduler to panic.
TInt RunError(TInt aError);
 
struct TFileChange
{
TFileChange(const TEntry aEntry, TFileAction aAction)
:fileEntry(aEntry),action(aAction){}
const TEntry fileEntry;
TFileAction action;
};
 
private:
enum TCDirectoryMonitorState
{
EUninitialized, // Uninitialized
EInitialized, // Initalized
EError // Error condition
};
 
private:
TInt iState; // State of the active object
RFs iFs;
DirectoryObserver* iObserver;
CDir* iOldDir;
CDir* iNewDir;
RArray<TFileChange> iFileChangeArray;
RArray<TEntry> iFileList;
HBufC* iPath;
};
 
#endif // CDirectoryMonitor_H


Source file

/*
============================================================================
Name : DirectoryMonitor.cpp
Author  : Olympio Cipriano
Version  : 1.0
Copyright  :
Description : CDirectoryMonitor implementation
============================================================================
*/

 
#include "DirectoryMonitor.h"
 
CDirectoryMonitor::CDirectoryMonitor( DirectoryObserver* aObserver ) :
CActive(EPriorityStandard),
iObserver( aObserver )
{
}
 
CDirectoryMonitor* CDirectoryMonitor::NewLC( DirectoryObserver* aObserver )
{
CDirectoryMonitor* self = new ( ELeave ) CDirectoryMonitor( aObserver );
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
 
CDirectoryMonitor* CDirectoryMonitor::NewL( DirectoryObserver* aObserver )
{
CDirectoryMonitor* self = CDirectoryMonitor::NewLC( aObserver );
CleanupStack::Pop(); // self;
return self;
}
 
void CDirectoryMonitor::ConstructL()
{
User::LeaveIfError( iFs.Connect() );
CActiveScheduler::Add( this ); // Add to scheduler
iPath = HBufC16::NewL(100);
}
 
CDirectoryMonitor::~CDirectoryMonitor()
{
Cancel(); // Cancel any request, if outstanding
iFs.Close();
iFileChangeArray.Close();
if( iOldDir )
delete iOldDir;
if( iNewDir )
delete iNewDir;
if( iPath )
delete iPath;
}
 
void CDirectoryMonitor::DoCancel()
{
iFs.NotifyChangeCancel( iStatus );
}
 
void CDirectoryMonitor::Monitor( const TDesC& aDirPath )
{
*iPath = aDirPath;
Cancel(); // Cancel any request, just to be sure
iState = EUninitialized;
iFs.NotifyChange( ENotifyFile, iStatus, *iPath );
ListFiles( iOldDir );
SetActive(); // Tell scheduler a request is active
}
 
void CDirectoryMonitor::RunL()
{
TInt err = iStatus.Int();
if ( err == KErrNone )
{
ListFiles( iNewDir );
DiffDirectoryContents( );
if( iObserver )
for (int i = 0; i < iFileChangeArray.Count(); ++i)
{
TFileChange changeEntry = iFileChangeArray[i];
iObserver->DirectoryChanged( changeEntry.fileEntry.iName, changeEntry.action );
}
Clean();
iFs.NotifyChange( ENotifyEntry, iStatus, *iPath );
SetActive(); // Tell scheduler a request is active
}
}
 
TInt CDirectoryMonitor::RunError(TInt aError)
{
return aError;
}
 
void CDirectoryMonitor::ListFiles( CDir*& aDir )
{
if( aDir )
{
delete aDir;
aDir = 0;
}
TInt err = iFs.GetDir( *iPath, KEntryAttNormal, ESortByName, aDir );
if( err )
{
//TODO: error handling
}
 
}
 
void CDirectoryMonitor::DiffDirectoryContents( )
{
for (int i = 0; (iOldDir != NULL) && (i < iNewDir->Count()); ++i)
{
const TEntry entry = (const TEntry& )(*iNewDir)[i];
if( ! SearchEntry( entry, iOldDir ) )
{
//file added
TFileChange change(entry,EFileAdded);
iFileChangeArray.Append( change );
}
}
for (int i = 0; ( iOldDir != NULL ) && ( i < iOldDir->Count() ); ++i)
{
const TEntry entry = (const TEntry& )(*iOldDir)[i];
if( ! SearchEntry( entry, iNewDir ) )
{
//file added
TFileChange change(entry,EFileErased);
iFileChangeArray.Append( change );
}
}
}
 
bool CDirectoryMonitor::SearchEntry( const TEntry& aEntry, CDir * aDir )
{
for (int i = 0; ( aDir != NULL ) && ( i < aDir->Count() ); ++i)
{
const TEntry& dirEntry = (const TEntry& ) (*aDir)[i];
TDesC& entryName = (TDesC&) dirEntry.iName;
if ( entryName.Compare( aEntry.iName ) == 0 )
return true;
}
return false;
}
 
void CDirectoryMonitor::Clean()
{
if( iNewDir )
{
delete iNewDir;
iNewDir = 0;
}
iFileChangeArray.Reset();
ListFiles( iOldDir );
}
//end line


Postconditions

This code monitors a specific folder. A call to Monitor member funcion starts the monitoring process. The changes to be monitored are those occurred after the call to Monitor function.


Test application and other attachments

Directory Monitor Source Code: File:DirectoryMonitoring.zip

Related Wiki Articles

No related wiki articles found

Rate This

 
Bookmark this page: DeliciousDiggFacebookGoogleYahooStumbleUponRedditDiigoTechnocratiTwitter  Share this page Share this page Print this Page Print this page Invite a friend Invite a friend
京ICP备05048969号    Email Newsletters Press Terms & Conditions Privacy Policy Sitemap Contact Us © 2009 Nokia 
RDF Facets: qdcZdescriptionQSxEa0E20WikiE20javaE20symbianE5fosE20s60E20maemoE20cE2bE2bE20WikiE20HomeE20WikiE20HelpE20OverviewE20GlossaryE20CreateE20PageE20ProposeE20anE20ArticleE20SpotlightE20TopicE20E2dE20WE52TE20WidgetsE20ProgrammingE20E4canguageE20E2dE20SymbianE20CE2bE2bE20E2dE20OpenE20CE2fCE2bE2bE20E2dE20JavaE20E2dE20FlashE20E4citeE20E2dE20PythonE20WebE20TechnologiesE20E2dE20WE52TE20WidgetsE20E2dE20WidSetsE20ToolsE20andE20SE44KE20CodeE20E45E78amplesE20KnowledgeE20BaseE20TechnologyE20AreasE20SoftwareE20PlatformsE20E44evelopmentE20ProcessE20E3fE3fWikiE20ChineseE20E3fE3fE3fWikiE20JapaneseE20PortugueseE2fBrazilianE20E52ussianE20WhatE20linksE20hereE20UploadE20fileE20SpecialE20pagesE20PrintableE20versionE44ownloadE20asE20PE44FE20GoE20ToE20E2eE2eE2eX qdcZidentifierQSxhttpE3aE2fE2fwikiE2eforumE2enokiaE2ecomE2findeE78E2ephpE2fHowE5ftoE5fgetE5fGE44E52E5ffontsX qdcZpublisherQUxhttpE3aE2fE2fswE2enokiaE2ecomE2fidE2fc764fd1cE2d8b06E2d499aE2d9a6aE2d17c3903d5a65E2fforumE5fnokiaE5fcrawlerE5fagentX qdcZtitleQSxHowE20toE20getE20GE44E52E20fontsE20E2dE20ForumE20NokiaE20WikiX qdcZtypeQUqfnZE45E78cludedFromGeneralE4cistingsQ qdcZtypeQUqfntypeZCommunityContentQ qdcZtypeQUqfntypeZE52esourceQ qdcZtypeQUqfntypeZWebpageQ qdcZtypeQUqfntypeZWikiContentQ qdcZtypeQUqmarsZManagedE52esourceQ qdcZtypeQUqwebZInformationE52esourceQ qdcZtypeQUqwebZPageQ qdcZtypeQUqwebZE52esourceQ qdcZtypeQUqrdfsZE52esourceQ qrssZdescriptionQSxEa0E20WikiE20javaE20symbianE5fosE20s60E20maemoE20cE2bE2bE20WikiE20HomeE20WikiE20HelpE20OverviewE20GlossaryE20CreateE20PageE20ProposeE20anE20ArticleE20SpotlightE20TopicE20E2dE20WE52TE20WidgetsE20ProgrammingE20E4canguageE20E2dE20SymbianE20CE2bE2bE20E2dE20OpenE20CE2fCE2bE2bE20E2dE20JavaE20E2dE20FlashE20E4citeE20E2dE20PythonE20WebE20TechnologiesE20E2dE20WE52TE20WidgetsE20E2dE20WidSetsE20ToolsE20andE20SE44KE20CodeE20E45E78amplesE20KnowledgeE20BaseE20TechnologyE20AreasE20SoftwareE20PlatformsE20E44evelopmentE20ProcessE20E3fE3fWikiE20ChineseE20E3fE3fE3fWikiE20JapaneseE20PortugueseE2fBrazilianE20E52ussianE20WhatE20linksE20hereE20UploadE20fileE20SpecialE20pagesE20PrintableE20versionE44ownloadE20asE20PE44FE20GoE20ToE20E2eE2eE2eX qfnZdistributionQUxhttpE3aE2fE2fwikiE2eforumE2enokiaE2ecomE2fX qfnZtopicQUqfnTopicZseriesE5f60QRqdcZtypeQUqrdfsZE52esourceQRqmarsZrelevanceQNx100X qfnZtypeQUqfntypeZCommunityContentQ qfnZtypeQUqfntypeZE52esourceQ qfnZtypeQUqfntypeZWebpageQ qfnZtypeQUqfntypeZWikiContentQ qfnZupdatedQDx2008E2d10E2d03X qfnZuserE5ftagQSxs60X qmarsZdescriptionQSxEa0E20WikiE20javaE20symbianE5fosE20s60E20maemoE20cE2bE2bE20WikiE20HomeE20WikiE20HelpE20OverviewE20GlossaryE20CreateE20PageE20ProposeE20anE20ArticleE20SpotlightE20TopicE20E2dE20WE52TE20WidgetsE20ProgrammingE20E4canguageE20E2dE20SymbianE20CE2bE2bE20E2dE20OpenE20CE2fCE2bE2bE20E2dE20JavaE20E2dE20FlashE20E4citeE20E2dE20PythonE20WebE20TechnologiesE20E2dE20WE52TE20WidgetsE20E2dE20WidSetsE20ToolsE20andE20SE44KE20CodeE20E45E78amplesE20KnowledgeE20BaseE20TechnologyE20AreasE20SoftwareE20PlatformsE20E44evelopmentE20ProcessE20E3fE3fWikiE20ChineseE20E3fE3fE3fWikiE20JapaneseE20PortugueseE2fBrazilianE20E52ussianE20WhatE20linksE20hereE20UploadE20fileE20SpecialE20pagesE20PrintableE20versionE44ownloadE20asE20PE44FE20GoE20ToE20E2eE2eE2eX qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX qrdfZtypeQUqfnZE45E78cludedFromGeneralE4cistingsQ qrdfZtypeQUqfntypeZCommunityContentQ qrdfZtypeQUqfntypeZE52esourceQ qrdfZtypeQUqfntypeZWebpageQ qrdfZtypeQUqfntypeZWikiContentQ qrdfZtypeQUqmarsZManagedE52esourceQ qrdfZtypeQUqwebZInformationE52esourceQ qrdfZtypeQUqwebZPageQ qrdfZtypeQUqwebZE52esourceQ qrdfZtypeQUqrdfsZE52esourceQ