Exemplo n.º 1
0
// Open a file. Called by the constructor.
// Returns true if the file was successfully opened, false otherwise.
bool InputFile::openFile(const char * filename, const char * mode,
                         InputFile::ifileCompression compressionMode)
{
    // If a file is for write, just open a new file.
    if (mode[0] == 'w' || mode[0] == 'W')
    {
        openFileUsingMode(filename, mode, compressionMode);
    }
    else
    {
        // Check if reading from stdin.
        if(strcmp(filename, "-") == 0)
        {
            // Reading from stdin, open it based on the 
            // compression mode.
            openFileUsingMode(filename, mode, compressionMode);
        }
        else
        {
            // Not from stdin, so determine the file type.

            // Open the file read only to determine file type.
            FILE* filePtr = fopen(filename, "r");
            
            // If the file could not be opened, either create a new one or
            // return failure.
            if (filePtr == NULL)
            {
                // If the mode is for read, then the file must exist, otherwise,
                // create a new file.
                if (mode[0] == 'r' || mode[0] == 'R')
                {
                    // File must exist.
                    if (myFileTypePtr != NULL)
                    {
                        delete myFileTypePtr;
                        myFileTypePtr = NULL;
                    }
                    // Return false, was not opened.
                    return false;
                }
                else
                {
                    openFileUsingMode(filename, mode, compressionMode);
                }
            }
            else
            {
                // File was successfully opened, so try to determine the
                // filetype from the file.
                // Read the file to see if it a gzip file.
                GzipHeader gzipHeader;
                bool isGzip = gzipHeader.readHeader(filePtr);
                
                // The file header has been read, so close the file, so it can
                // be re-opened as the correct type.
                fclose(filePtr);

                if (isGzip)
                {
                    // This file is a gzip file.
                    // Check to see if it is BGZF Compression.
                    if (gzipHeader.isBgzfFile())
                    {
                        // This file has BGZF Compression, so set the file
                        // pointer.
                        myFileTypePtr = new BgzfFileType(filename, mode);
                    }
                    else
                    {
                        // Not BGZF, just a normal gzip.
                        myFileTypePtr = new GzipFileType(filename, mode);
                   }
                }
                else
                {
                    // The file is a uncompressed, uncompressed file,
                    // so set the myFileTypePtr accordingly.
                    myFileTypePtr = new UncompressedFileType(filename, mode);
                }
            }
        }
    }
    if(myFileTypePtr == NULL)
    {
        return(false);
    }
    if (!myFileTypePtr->isOpen())
    {
        // The file was not opened, so delete the pointer and set to null.
        delete myFileTypePtr;
        myFileTypePtr = NULL;
        return false;
    }

    if(myAllocatedBufferSize == 1)
    {
        myFileTypePtr->setBuffered(false);
    }
    else
    {
        myFileTypePtr->setBuffered(true);
    }
    myFileName = filename;
    return true;
}
Exemplo n.º 2
0
// Open a file. Called by the constructor.
// Returns true if the file was successfully opened, false otherwise.
bool InputFile::openFile(const char * filename, const char * mode,
                         InputFile::ifileCompression compressionMode)
{
    //
    // if recovering, we don't want to issue big readaheads, since
    // that interferes with the decompression - we only want to 
    // decompress one at a time, and handle the exceptions immediately
    // rather than at some indeterminate point in time.
    //
    if(myAttemptRecovery) {
        bufferReads(1);
    }
    // If a file is for write, just open a new file.
    if (mode[0] == 'w' || mode[0] == 'W')
    {
        openFileUsingMode(filename, mode, compressionMode);
    }
    else
    {
        // Check if reading from stdin.
        if((strcmp(filename, "-") == 0) || (strcmp(filename, "-.gz") == 0))
        {
            // Reading from stdin, open it based on the 
            // compression mode.
            openFileUsingMode(filename, mode, compressionMode);
        }
        else
        {
            // Not from stdin, so determine the file type.

            // Open the file read only to determine file type.
            FILE* filePtr = fopen(filename, "r");
            
            // If the file could not be opened, either create a new one or
            // return failure.
            if (filePtr == NULL)
            {
                // If the mode is for read, then the file must exist, otherwise,
                // create a new file.
                if (mode[0] == 'r' || mode[0] == 'R')
                {
                    // File must exist.
                    if (myFileTypePtr != NULL)
                    {
                        delete myFileTypePtr;
                        myFileTypePtr = NULL;
                    }
                    // Return false, was not opened.
                    return false;
                }
                else
                {
                    openFileUsingMode(filename, mode, compressionMode);
                }
            }
            else
            {
                // File was successfully opened, so try to determine the
                // filetype from the file.
                // Read the file to see if it a gzip file.
                GzipHeader gzipHeader;
                bool isGzip = gzipHeader.readHeader(filePtr);
                
                // The file header has been read, so close the file, so it can
                // be re-opened as the correct type.
                fclose(filePtr);

                if (isGzip)
                {
                    // This file is a gzip file.
                    // Check to see if it is BGZF Compression.
                    if (gzipHeader.isBgzfFile())
                    {
                        // This file has BGZF Compression, so set the file
                        // pointer.
                        if(myAttemptRecovery) {
                            // NB: this reader will throw std::runtime_error when it recovers
                            myFileTypePtr = new BgzfFileTypeRecovery(filename, mode);
                        } else {
                            // use the standard bgzf reader (samtools)
                            myFileTypePtr = new BgzfFileType(filename, mode);
                        }
                    }
                    else
                    {
                        // Not BGZF, just a normal gzip.
                        myFileTypePtr = new GzipFileType(filename, mode);
                   }
                }
                else
                {
                    // The file is a uncompressed, uncompressed file,
                    // so set the myFileTypePtr accordingly.
                    myFileTypePtr = new UncompressedFileType(filename, mode);
                }
            }
        }
    }
    if(myFileTypePtr == NULL)
    {
        return(false);
    }
    if (!myFileTypePtr->isOpen())
    {
        // The file was not opened, so delete the pointer and set to null.
        delete myFileTypePtr;
        myFileTypePtr = NULL;
        return false;
    }

    if(myAllocatedBufferSize == 1)
    {
        myFileTypePtr->setBuffered(false);
    }
    else
    {
        myFileTypePtr->setBuffered(true);
    }
    myFileName = filename;
    return true;
}