// 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; }
// 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; }