<div dir="ltr">Hi,<br>i am now doing some prototypes for my projects which will be dealing with tones of files. After a little scouting i decided to try z3c.extfile. Every thing works fine. But i found it strange that there is no delete feature in z3c.extfile. ie, even if i can delete a ExtFile object, the file in the hash directory is not getting deleted! and it keeps on accumulating... <br>
<br>So i thought i 'll add a delete feature... but my __del__() approach doesn't work for me. but i added an additional delete() function too which can be invoked explicitly to delete the file before trying to delete ExtFile object.<br>
<br>i made following changes to the source...<br>inside z3c.extfile.file.file.ExtFile,<br><br>----------------------------------------------------------------------------------------------<br>class ExtFile(Persistent):<br>
<br> """A zope file implementation based on z3c.extfile"""<br><br> interface.implements(IExtFile)<br> data = ExtBytesProperty('data')<br> <br> def __init__(self, data='', contentType=''):<br>
self.data = data<br> self.contentType = contentType<br><br> # added the following lines#<br><br><i> def __del__(self): # <- this is not being invoked when i try to delete an extfile object<br> del self.data<br>
#print "deleted data via destructor"<br><br> def delete(self): # <- added this to be able to manually able to delete files<br> del self.data<br> #print "deleted data via delete()"<br>
<br> # # # # # # # # # # # # # # #<br></i> <br> def getSize(self):<br> return len(self.data)<br><br>----------------------------------------------------------------------------------------------<br><br>and the 'data' is a 'property' (ExtBytesProperty)<br>
so i made following changes to z3c.extfile.property.ExtBytesProperty<br><br>----------------------------------------------------------------------------------------------<br>class ExtBytesProperty(object):<br><br> """a property which's values are stored as external files"""<br>
<br> def __init__(self, name):<br> self.__name = name<br><br><br> <br> # added the following lines#<br><br><i> def __delete__(self,inst):<br> digest = inst.__dict__[self.__name] <br>
self.hd.delete(digest)<br><br></i> <i># # # # # # # # # # # # # # #<br><br><br><br></i> @property<br> def hd(self):<br> return component.getUtility(interfaces.IHashDir)<br><br> def __get__(self, inst, klass):<br>
<br> if inst is None:<br> return self<br> digest = inst.__dict__.get(self.__name, _marker)<br> if digest is _marker:<br> return None<br> return getFile(digest)<br><br> def __set__(self, inst, value):<br>
# ignore if value is None<br> if value is None:<br> if inst.__dict__.has_key(self.__name):<br> del inst.__dict__[self.__name]<br> return<br> # Handle case when value is a string<br>
if isinstance(value, unicode):<br> value = value.encode('UTF-8')<br> if isinstance(value, str):<br> value = StringIO(value)<br> value.seek(0)<br> f = self.hd.new()<br>
while True:<br> chunk = value.read(BLOCK_SIZE)<br> if not chunk:<br> newDigest = f.commit()<br> oldDigest = inst.__dict__.get(self.__name, _marker)<br> if newDigest == oldDigest:<br>
# we have no change, so we have to seek to zero<br> # because this is normal behaviour when setting a<br> # new value<br> if hasattr(_storage, 'dataManager'):<br>
if newDigest in _storage.dataManager.files:<br> f = _storage.dataManager.files[newDigest]<br> f.seek(0)<br> else:<br> inst.__dict__[self.__name] = newDigest<br>
break<br> f.write(chunk)<br>----------------------------------------------------------------------------------------------------<br><br>and at last added the real code which delete the file in hash directory too<br>
<br>i added following codes inside z3c.extfile.hashdir.HashDir class<br>---------------------------------------------------<br>def delete(self,digest):<br> """delete the file"""<br> path=self.getPath(digest)<br>
if os.path.exists(path): <br> os.remove(path) <br> return <br>----------------------------------------------------<br><br>Now, everything works fine when i try to delete an ExtFile object in ZODB, __del__() is not being invoked!!!!!<br>
<br>can anyone tell me how can i fix this??? <br><br>thanks in advance<br><br>jayaraj<br></div>