storeFile method

Future<void> storeFile(
  1. String filename
)

Implementation

Future<void> storeFile(String filename) async {
  if (!await openDataConnection()) {
    return;
  }

  File? file;
  IOSink? fileSink;

  try {
    String fullPath = fileOperations.resolvePath(filename);
    transferInProgress = true;

    // Create the directory if it doesn't exist
    final directory = Directory(fullPath).parent;
    if (!await directory.exists()) {
      await directory.create(recursive: true);
    }

    file = File(fullPath);
    fileSink = file.openWrite();

    // Handle socket errors during file upload
    dataSocket!.listen(
      (data) {
        if (transferInProgress) {
          try {
            fileSink?.add(data);
          } catch (e) {
            logger.generalLog('Error writing to file: $e');
            _handleTransferError(fileSink);
          }
        }
      },
      onDone: () async {
        if (transferInProgress) {
          try {
            await fileSink?.flush();
            await fileSink?.close();
            transferInProgress = false;
            await _closeDataSocket();
            sendResponse('226 Transfer complete');
            logger
                .generalLog('File transfer complete: $filename to $fullPath');
          } catch (e) {
            logger.generalLog('Error closing file after transfer: $e');
            _handleTransferError(fileSink);
          }
        }
      },
      onError: (error) async {
        logger.generalLog('Socket error during file upload: $error');
        _handleTransferError(fileSink);
      },
      cancelOnError: true,
    );
  } catch (e) {
    logger.generalLog('Exception in storeFile: $e');
    sendResponse('550 Error creating file or directory: $e');
    transferInProgress = false;
    fileSink
        ?.close()
        .catchError((e) => logger.generalLog('Error closing file sink: $e'));
    await _closeDataSocket();
  }
}