listDirectory method

Future<void> listDirectory(
  1. String path
)

Implementation

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

  try {
    transferInProgress = true;

    var dirContents = await fileOperations.listDirectory(path);
    logger.generalLog(
        'Listing directory: $path, for ${fileOperations.resolvePath(path)} dir contents: $dirContents');

    for (FileSystemEntity entity in dirContents) {
      if (!transferInProgress) break; // Abort if transfer is cancelled

      try {
        var stat = await entity.stat();
        String permissions = _formatPermissions(stat);
        String fileSize = stat.size.toString();
        String modificationTime = _formatModificationTime(stat.modified);
        String fileName = entity.path.split(Platform.pathSeparator).last;
        String entry =
            '$permissions 1 ftp ftp $fileSize $modificationTime $fileName\r\n';

        if (dataSocket == null || !transferInProgress) break;

        try {
          dataSocket!.write(entry);
        } catch (socketError) {
          logger.generalLog(
              'Socket write error during directory listing: $socketError');
          transferInProgress = false;
          break;
        }
      } catch (entityError) {
        logger.generalLog(
            'Error processing entity during directory listing: $entityError');
        // Continue with next entity
        continue;
      }
    }

    if (transferInProgress) {
      transferInProgress = false;
      await _closeDataSocket();
      sendResponse('226 Transfer complete');
    } else {
      await _closeDataSocket();
      sendResponse('426 Transfer aborted');
    }
  } catch (e) {
    logger.generalLog('Error listing directory: $e');
    sendResponse('550 Failed to list directory');
    transferInProgress = false;
    await _closeDataSocket();
  }
}