Esempio n. 1
0
        [System.Security.SecuritySafeCritical]  // auto-generated
        public IsolatedStorageFileStream(String path, FileMode mode,
                                         FileAccess access, FileShare share, int bufferSize,
                                         IsolatedStorageFile isf)
        {
            if (path == null)
            {
                throw new ArgumentNullException("path");
            }
            Contract.EndContractBlock();

#if FEATURE_PAL
            if (s_BackSlash == null)
            {
                s_BackSlash = new String(System.IO.Path.DirectorySeparatorChar, 1);
            }
#endif // FEATURE_PAL

            if ((path.Length == 0) || path.Equals(s_BackSlash))
            {
                throw new ArgumentException(
                          Environment.GetResourceString(
                              "IsolatedStorage_Path"));
            }

            if (isf == null)
            {
#if FEATURE_ISOSTORE_LIGHT
                throw new ArgumentNullException("isf");
#else // !FEATURE_ISOSTORE_LIGHT
                m_OwnedStore = true;
                isf          = IsolatedStorageFile.GetUserStoreForDomain();
#endif // !FEATURE_ISOSTORE_LIGHT
            }

            if (isf.Disposed)
            {
                throw new ObjectDisposedException(null, Environment.GetResourceString("IsolatedStorage_StoreNotOpen"));
            }

            switch (mode)
            {
            case FileMode.CreateNew:            // Assume new file
            case FileMode.Create:               // Check for New file & Unreserve
            case FileMode.OpenOrCreate:         // Check for new file
            case FileMode.Truncate:             // Unreserve old file size
            case FileMode.Append:               // Check for new file
            case FileMode.Open:                 // Open existing, else exception
                break;

            default:
                throw new ArgumentException(Environment.GetResourceString("IsolatedStorage_FileOpenMode"));
            }

            m_isf = isf;

#if !FEATURE_CORECLR
            FileIOPermission fiop =
                new FileIOPermission(FileIOPermissionAccess.AllAccess,
                                     m_isf.RootDirectory);

            fiop.Assert();
            fiop.PermitOnly();
#endif

            m_GivenPath = path;
            m_FullPath  = m_isf.GetFullPath(m_GivenPath);

#if FEATURE_ISOLATED_STORAGE_QUOTA_ENFORCEMENT
            ulong oldFileSize = 0, newFileSize;
            bool  fNewFile = false, fLock = false;

            RuntimeHelpers.PrepareConstrainedRegions();
            try { // for finally Unlocking locked store
                  // Cache the old file size if the file size could change
                  // Also find if we are going to create a new file.

                switch (mode)
                {
                case FileMode.CreateNew:            // Assume new file
#if FEATURE_ISOSTORE_LIGHT
                    // We are going to call Reserve so we need to lock the store.
                    m_isf.Lock(ref fLock);
#endif
                    fNewFile = true;
                    break;

                case FileMode.Create:               // Check for New file & Unreserve
                case FileMode.OpenOrCreate:         // Check for new file
                case FileMode.Truncate:             // Unreserve old file size
                case FileMode.Append:               // Check for new file

                    m_isf.Lock(ref fLock);          // oldFileSize needs to be
                    // protected

                    try {
#if FEATURE_ISOSTORE_LIGHT
                        oldFileSize = IsolatedStorageFile.RoundToBlockSize((ulong)(FileInfo.UnsafeCreateFileInfo(m_FullPath).Length));
#else
                        oldFileSize = IsolatedStorageFile.RoundToBlockSize((ulong)LongPathFile.GetLength(m_FullPath));
#endif
                    } catch (FileNotFoundException) {
                        fNewFile = true;
                    } catch {
                    }

                    break;

                case FileMode.Open:                 // Open existing, else exception
                    break;
                }

                if (fNewFile)
                {
                    m_isf.ReserveOneBlock();
                }
#endif // FEATURE_ISOLATED_STORAGE_QUOTA_ENFORCEMENT

            try {
#if FEATURE_CORECLR
                // Since FileStream's .ctor won't do a demand, we need to do our access check here.
                m_isf.Demand(m_FullPath);
#endif

#if FEATURE_ISOSTORE_LIGHT
                m_fs = new
                       FileStream(m_FullPath, mode, access, share, bufferSize,
                                  FileOptions.None, m_GivenPath, true);
            } catch (Exception e) {
#else
                m_fs = new
                       FileStream(m_FullPath, mode, access, share, bufferSize,
                                  FileOptions.None, m_GivenPath, true, true);
            } catch {
#endif
#if FEATURE_ISOLATED_STORAGE_QUOTA_ENFORCEMENT
                if (fNewFile)
                {
                    m_isf.UnreserveOneBlock();
                }
#endif // FEATURE_ISOLATED_STORAGE_QUOTA_ENFORCEMENT
#if FEATURE_ISOSTORE_LIGHT
                // IsoStore generally does not let arbitrary exceptions flow out: a
                // IsolatedStorageException is thrown instead (see examples in IsolatedStorageFile.cs
                // Keeping this scoped to coreclr just because changing the exception type thrown is a
                // breaking change and that should not be introduced into the desktop without deliberation.
                //
                // Note that GetIsolatedStorageException may set InnerException. To the real exception
                // Today it always does this, for debug and chk builds, and for other builds asks the host
                // if it is okay to do so.
                throw IsolatedStorageFile.GetIsolatedStorageException("IsolatedStorage_Operation_ISFS", e);
#else
                throw;
#endif // FEATURE_ISOSTORE_LIGHT
            }

#if FEATURE_ISOLATED_STORAGE_QUOTA_ENFORCEMENT
            // make adjustment to the Reserve / Unreserve state

            if ((fNewFile == false) &&
                ((mode == FileMode.Truncate) || (mode == FileMode.Create)))
            {
                newFileSize = IsolatedStorageFile.RoundToBlockSize((ulong)m_fs.Length);

                if (oldFileSize > newFileSize)
                {
                    m_isf.Unreserve(oldFileSize - newFileSize);
                }
                else if (newFileSize > oldFileSize)         // Can this happen ?
                {
                    m_isf.Reserve(newFileSize - oldFileSize);
                }
            }
        }

        finally {
            if (fLock)
            {
                m_isf.Unlock();
            }
        }
#endif // FEATURE_ISOLATED_STORAGE_QUOTA_ENFORCEMENT

#if !FEATURE_CORECLR
            CodeAccessPermission.RevertAll();
#endif
        }
Esempio n. 2
0
        public IsolatedStorageFileStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, IsolatedStorageFile isf)
        {
            if (path == null)
            {
                throw new ArgumentNullException("path");
            }
            if (path.Length == 0 || path.Equals("\\"))
            {
                throw new ArgumentException(Environment.GetResourceString("IsolatedStorage_Path"));
            }
            if (isf == null)
            {
                this.m_OwnedStore = true;
                isf = IsolatedStorageFile.GetUserStoreForDomain();
            }
            if (isf.Disposed)
            {
                throw new ObjectDisposedException((string)null, Environment.GetResourceString("IsolatedStorage_StoreNotOpen"));
            }
            switch (mode)
            {
            case FileMode.CreateNew:
            case FileMode.Create:
            case FileMode.Open:
            case FileMode.OpenOrCreate:
            case FileMode.Truncate:
            case FileMode.Append:
                this.m_isf = isf;
                FileIOPermission fileIoPermission = new FileIOPermission(FileIOPermissionAccess.AllAccess, this.m_isf.RootDirectory);
                fileIoPermission.Assert();
                fileIoPermission.PermitOnly();
                this.m_GivenPath = path;
                this.m_FullPath  = this.m_isf.GetFullPath(this.m_GivenPath);
                ulong num    = 0;
                bool  flag   = false;
                bool  locked = false;
                RuntimeHelpers.PrepareConstrainedRegions();
                try
                {
                    switch (mode)
                    {
                    case FileMode.CreateNew:
                        flag = true;
                        break;

                    case FileMode.Create:
                    case FileMode.OpenOrCreate:
                    case FileMode.Truncate:
                    case FileMode.Append:
                        this.m_isf.Lock(ref locked);
                        try
                        {
                            num = IsolatedStorageFile.RoundToBlockSize((ulong)LongPathFile.GetLength(this.m_FullPath));
                            break;
                        }
                        catch (FileNotFoundException ex)
                        {
                            flag = true;
                            break;
                        }
                        catch
                        {
                            break;
                        }
                    }
                    if (flag)
                    {
                        this.m_isf.ReserveOneBlock();
                    }
                    try
                    {
                        this.m_fs = new FileStream(this.m_FullPath, mode, access, share, bufferSize, FileOptions.None, this.m_GivenPath, true, true);
                    }
                    catch
                    {
                        if (flag)
                        {
                            this.m_isf.UnreserveOneBlock();
                        }
                        throw;
                    }
                    if (!flag)
                    {
                        if (mode != FileMode.Truncate)
                        {
                            if (mode != FileMode.Create)
                            {
                                goto label_34;
                            }
                        }
                        ulong blockSize = IsolatedStorageFile.RoundToBlockSize((ulong)this.m_fs.Length);
                        if (num > blockSize)
                        {
                            this.m_isf.Unreserve(num - blockSize);
                        }
                        else if (blockSize > num)
                        {
                            this.m_isf.Reserve(blockSize - num);
                        }
                    }
                }
                finally
                {
                    if (locked)
                    {
                        this.m_isf.Unlock();
                    }
                }
label_34:
                CodeAccessPermission.RevertAll();
                break;

            default:
                throw new ArgumentException(Environment.GetResourceString("IsolatedStorage_FileOpenMode"));
            }
        }