コード例 #1
0
ファイル: retro_dirent.c プロジェクト: ColinKinloch/RetroArch
/**
 *
 * retro_dirent_is_dir:
 * @rdir         : pointer to the directory entry.
 * @path         : path to the directory entry.
 *
 * Is the directory listing entry a directory?
 *
 * Returns: true if directory listing entry is
 * a directory, false if not.
 */
bool retro_dirent_is_dir(struct RDIR *rdir, const char *path)
{
#if defined(_WIN32)
   const WIN32_FIND_DATA *entry = (const WIN32_FIND_DATA*)&rdir->entry;
   return entry->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
#elif defined(PSP) || defined(VITA)
   const SceIoDirent *entry = (const SceIoDirent*)&rdir->entry;
#if defined(PSP)
   return (entry->d_stat.st_attr & FIO_SO_IFDIR) == FIO_SO_IFDIR;
#elif defined(VITA)
   return PSP2_S_ISDIR(entry->d_stat.st_mode);
#endif
#elif defined(__CELLOS_LV2__)
   CellFsDirent *entry = (CellFsDirent*)&rdir->entry;
   return (entry->d_type == CELL_FS_TYPE_DIRECTORY);
#elif defined(DT_DIR)
   const struct dirent *entry = (const struct dirent*)rdir->entry;
   if (entry->d_type == DT_DIR)
      return true;
   /* This can happen on certain file systems. */
   if (entry->d_type == DT_UNKNOWN || entry->d_type == DT_LNK)
      return path_is_directory(path);
   return false;
#else
   /* dirent struct doesn't have d_type, do it the slow way ... */
   return path_is_directory(path);
#endif
}
コード例 #2
0
ファイル: system.c プロジェクト: Xeeynamo/smallHex
DirectoryResult DirectoryNext(Directory directory, DirectoryEntry *entry)
{
	DirectoryResult result = Directory_Error;
	if (directory == DirectoryInvalid)
		return Directory_Error;
#if defined(_WIN32)
	DirectoryData *dirData = (DirectoryData*)directory;
	if (dirData->IsEnd == TRUE)
		return Directory_EndOfEntries;
	strncpy(entry->name, dirData->FindData.cFileName, MAX_PATH);

	entry->length = dirData->FindData.nFileSizeLow;
	bool isreadonly = (dirData->FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) != 0;
	bool ishidden = (dirData->FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0;
	bool issystem = (dirData->FindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) != 0;
	bool isdirectory = (dirData->FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
	if (isdirectory)
		entry->length = -1;
	BOOL ret = FindNextFile(dirData->hDir, &dirData->FindData);
	if (ret == FALSE)
	{
		if (GetLastError() != ERROR_NO_MORE_FILES)
			return Directory_Error;
		dirData->IsEnd = TRUE;
	}
	result = Directory_Continue;
#elif defined(PLATFORM_PSP2)
	SceIoDirent dir;
	int res = sceIoDread((SceUID)directory, &dir);
	if (res < 0)
		return Directory_Error;
	strcpy(entry->name, dir.d_name);
	if (PSP2_S_ISDIR(dir.d_stat.st_mode))
		entry->length = -1;
	else
		entry->length = dir.d_stat.st_size;
	result = res == 0 ? Directory_EndOfEntries : Directory_Continue;
#endif
	// Check for "." or ".."
	if (result == Directory_Continue)
	{
		if (entry->length < 0 && entry->name[0] == '.')
		{
			// Probably it's the directory pointer, do more checks
			if (entry->name[1] == '\0' ||
				(entry->name[1] == '.' && entry->name[2] == '\0'))
				// it is, recursively call again DirectoryNext
				return DirectoryNext(directory, entry);
		}
	}
	return result;
}
コード例 #3
0
ファイル: ftp.c プロジェクト: jadfeitrouni/FTPVita
static void send_LIST(ClientInfo *client, const char *path)
{
	char buffer[512];
	SceUID dir;
	SceIoDirent dirent;

	dir = sceIoDopen(path);
	if (dir < 0) {
		client_send_ctrl_msg(client, "550 Invalid directory.\n");
		return;
	}

	client_send_ctrl_msg(client, "150 Opening ASCII mode data transfer for LIST.\n");

	client_open_data_connection(client);

	memset(&dirent, 0, sizeof(dirent));

	while (sceIoDread(dir, &dirent) > 0) {
		gen_list_format(buffer, sizeof(buffer),
			PSP2_S_ISDIR(dirent.d_stat.st_mode),
			dirent.d_stat.st_size,
			dirent.d_stat.st_ctime.month,
			dirent.d_stat.st_ctime.day,
			dirent.d_stat.st_ctime.hour,
			dirent.d_stat.st_ctime.minute,
			dirent.d_name);

		client_send_data_msg(client, buffer);
		memset(&dirent, 0, sizeof(dirent));
		memset(buffer, 0, sizeof(buffer));
	}

	sceIoDclose(dir);

	DEBUG("Done sending LIST\n");

	client_close_data_connection(client);
	client_send_ctrl_msg(client, "226 Transfer complete.\n");
}
コード例 #4
0
ファイル: file_chooser.cpp プロジェクト: xerpi/NES4Vita
static int file_list_build(const char *path, file_list *list, const char *supported_ext[])
{
	SceUID dir;
	SceIoDirent dirent;

	dir = sceIoDopen(path);
	if (dir < 0) {
		return 0;
	}

	memset(&dirent, 0, sizeof(dirent));
	memset(list, 0, sizeof(*list));

	while (sceIoDread(dir, &dirent) > 0) {

		file_list_entry *entry = (file_list_entry *)malloc(sizeof(*entry));

		strcpy(entry->name, dirent.d_name);
		entry->is_dir = PSP2_S_ISDIR(dirent.d_stat.st_mode);
		if (!entry->is_dir) {
			entry->supported = file_supported(entry->name, supported_ext);
		}

		file_list_add_entry(list, entry);

		memset(&dirent, 0, sizeof(dirent));
	}

	sceIoDclose(dir);

	file_list_entry *up = (file_list_entry *)malloc(sizeof(*up));
	strcpy(up->name, "..");
	up->is_dir = 1;
	up->next = NULL;
	file_list_add_entry(list, up);

	return 0;
}