you can refer  attach file with this test code.
       poem = '\
        Programming is fun
        When the work is done
        if you wanna make your work also fun:
                use Python!
        '

        f = file('poem.txt', 'w') # open for 'w'riting
        f.write(poem) # write text to file
        f.close() # close the file

        f = file('poem.txt')
        # if no mode is specified, 'r'ead mode is assumed by default
        while True:
            line = f.readline()
            if len(line) == 0: # Zero length indicates EOF
                break
            print line,
            # Notice comma to avoid automatic newline added by Python
        f.close() # close the file

but the datastore limit filesize 1M.it is trashiness.
this code is included my opensource blog ,http://code.google.com/p/woiclub

On 12/19/08, Ross Ridge <rri...@csclub.uwaterloo.ca> wrote:
>
> jeremy wrote:
> > i was hoping to seamlessly virtualize a filesystem on top of
> > datastore. it seems there is no pure-python approach to filesystem
> > virtualization, making this impossible. should i give up on this or
> > have a i overlooked something?
>
> I don't see why you would think it's impossible.  It's certainly
> possible to write a filesystem implementation in pure Python, I've
> done it.
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~----------~----~----~----~------~----~------~--~---

"""
This is experimental code to provide writable filesystem capability to
App Engine.  It can be enabled through importing, just with ``import
filesystem``.
"""

from google.appengine.ext import db
from google.appengine.ext import gql
import os
import sys
import tempfile
from datetime import datetime
import time
from google.appengine.ext import db
import logging
import itertools
from StringIO import StringIO
'''
        poem = '\
        Programming is fun
        When the work is done
        if you wanna make your work also fun:
                use Python!
        '
        
        f = file('poem.txt', 'w') # open for 'w'riting
        f.write(poem) # write text to file
        f.close() # close the file
        
        f = file('poem.txt')
        # if no mode is specified, 'r'ead mode is assumed by default
        while True:
            line = f.readline()
            if len(line) == 0: # Zero length indicates EOF
                break
            print line,
            # Notice comma to avoid automatic newline added by Python
        f.close() # close the file   
'''
class Files(db.Model):
    basename = db.StringProperty()
    dir = db.StringProperty()
    path = db.StringProperty()
    content = db.BlobProperty()
    mtime_dt = db.DateTimeProperty(auto_now=True)
    ctime_dt = db.DateTimeProperty(auto_now_add=True)
    filetype = db.StringProperty()
    @property
    def is_dir(self):
        return not self.basename

    @classmethod
    def get_file(cls, filename, create=False ,filetype =None):
        query = cls.gql('WHERE path = :1', filename)
        files = query.fetch(1)
        if files:
            return files[0]
        if not create:
            return None
        if filename.startswith("/"):
            if not filetype:
                split = path.rfind('.')  
                ext = path[split + 1:]
            file = cls(
                key_name = filename,
                basename=os.path.basename(filename),
                dir=os.path.dirname(filename),
                path=filename,
                content='',
                mtime_dt=datetime.now(),
                ctime_dt=datetime.now(),
                filetype=ext,
                )
        return file

    @classmethod
    def listdir(cls, dir):
        results =[]
        files = cls.gql('WHERE dir = :1', dir)
        results = [file.basename for file in files]
        return results

    @classmethod
    def mkdir(cls, dir):
        pass

    @classmethod
    def readlink(cls, path):
#        path = os.path.abspath(path)
        obj = cls.get_file(path)
        if obj is None:
            return obj
        return obj.content

    @classmethod
    def remove(cls, path):
#        path = os.path.abspath(path)
        obj = cls.get_file(path)
        if not obj:
            db.delete(obj)

    @classmethod
    def rename(cls, src, dest):
        obj = cls.get_file(src)
        if obj is None:
            return False
        dest_obj = cls.get_file(dest)
        if dest_obj is not None:
            if dest_obj.is_dir:
                return False
            else:
                cls.remove(dest)
                return True
        obj.path = dest
        if obj.is_dir:
            obj.dir = dest
            obj.basename = ''
        else:
            obj.dir = os.path.dirname(dest)
            obj.basename = os.path.basename(dest)
        obj.put()

    @classmethod
    def rmdir(cls, path):
        pass

    @classmethod
    def stat(cls, path):
        obj = cls.get_file(path)
        if obj is None:
            return obj
        return os.stat_result((
            0, # mode
            0, # inode
            0, # device
            1, # hard links
            0, # owner uid
            0, # gid
            len(obj.content or ''), # size
            0, # atime
            obj.mtime, # mtime
            obj.ctime, # ctime
            ))

    @classmethod
    def dump(cls):
        """Returns all the files in a text description
        """
        objs = list(cls.all())
        objs.sort(key=lambda obj: obj.path)
        lines = []
        for obj in objs:
            if obj.is_dir:
                lines.append('Dir:  %s' % obj.path)
            else:
                lines.append('File: %s  (%i bytes)' % (obj.path, 
len(obj.content or '')))
        return '\n'.join(lines)


def open(oldfilename, mode='r', buffering=0):
    ## FIXME: totally ignore buffering?
    create = mode.startswith('w') or mode.startswith('rw') or 
mode.startswith('a')
    fileobj = Files.get_file(oldfilename, create=create)
    if fileobj is None:
        return None
    if fileobj.is_dir:
        return None
    return FileWrapper(fileobj, mode=mode)

class FileWrapper(object):

    def __init__(self, fileobj, pos=0, mode='r'):
        self.fileobj = fileobj
        self.pos = pos
        mode = mode.replace('U', '').replace('t', '').replace('b', '')
        assert mode in ('r', 'w', 'rw', 'a'), (
            "Bad mode: %r" % mode)
        self.mode = mode
        if mode == 'a':
            self.pos = len(self.fileobj.content)
        self._closed = False
  
    def read(self, size=-1):
        if size == -1:
            t = self.fileobj.content[self.pos:]
            self.pos = len(self.fileobj.content)
            return t
        else:
            t = self.fileobj.content[self.pos:self.pos+size]
            self.pos = min(len(self.fileobj.content), self.pos+size)
            return t

    def readline(self, size=-1):
        parts = self.fileobj.content[self.pos:].split('\n', 1)
        if len(parts) == 2:
            next = parts[0] + '\n'
        else:
            next = parts[0]
        if size == -1 or size <= len(next):
            self.pos += len(next)
            return next
        else:
            self.pos += size
            return next[:size]

    def readlines(self, size=-1):
        if size == -1:
            rest = self.fileobj.content[self.pos:]
            self.pos = len(self.fileobj.content)
        else:
            rest = self.fileobj.content[self.pos:self.pos+size]
            self.pos += size
        return rest.splitlines(True)

    def write(self, text):
        self.fileobj.content = self.fileobj.content[:self.pos] + text + 
self.fileobj.content[self.pos+len(text):]
        self.pos += len(text)
        self.fileobj.mtime_dt = datetime.now()
    
    def writelines(self, lines):
        self.write(''.join(lines))

    def seek(self, pos):
        self.assert_state(None)
        self.pos = pos

    def tell(self):
        self.assert_state(None)
        return self.pos

    def close(self):
        self.fileobj.put()
        self._closed = True

    def flush(self):
        self.assert_state(None)
        self.fileobj.put()

Reply via email to