AdvancedSharpAdbClient
AdvancedSharpAdbClient copied to clipboard
Pulling a folder that contains "." in it
Describe the bug
The new 3.2.11 release is really good,but it's still has bugs ,such as I cannot pull a folder that it's name contains dots in it(such as common package names folders).
On any other folders it works perfect!!
static AdbClient adbClient;
static DeviceData device;
private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
adbClient = new AdbClient();
adbClient.Connect("127.0.0.1:62001");
device = adbClient.GetDevices().FirstOrDefault(); // Get first connected device
SyncService service = new SyncService(device);
await PullFolderAsync("/sdcard/android/data/com.globile.mycontactbackup/files", @"C:\Users\Itamar\Documents\UBL");
}
SyncService service;
async Task PullFolderAsync(string remotePath, string localPath)
{
if (!Directory.Exists(localPath))
{
Directory.CreateDirectory(localPath);
}
service = new SyncService(device);
FileStatistics stat = await service.StatAsync(remotePath);
await PullFolderAsyncInternal(stat, remotePath, localPath);
}
async Task PullFolderAsyncInternal(FileStatistics stat, string remotePath, string localPath)
{
switch (stat.get_FileMode().GetFileType())
{
case UnixFileStatus.Directory:
if (remotePath != stat.Path)
{
localPath = System.IO.Path.Combine(localPath, stat.Path);
remotePath = LinuxPath.Combine(remotePath, stat.Path);
}
if (!Directory.Exists(localPath))
{
Directory.CreateDirectory(localPath);
}
foreach (FileStatistics item in await service.GetDirectoryListingAsync(remotePath))
{
await PullFolderAsyncInternal(item, remotePath, localPath);
}
break;
case UnixFileStatus.Regular:
string localFilePath = System.IO.Path.Combine(localPath, stat.Path);
using (FileStream stream = File.OpenWrite(localFilePath))
{
await service.PullAsync(LinuxPath.Combine(remotePath, stat.Path), stream);
await stream.FlushAsync();
}
break;
}
}
Steps to reproduce the bug
pull folders
Expected behavior
No response
Screenshots
No response
NuGet package version
None
.NET Platform
No response
Platform type
No response
System version
No response
IDE
No response
Additional context
No response
@wherewhere what's so odd? I'm trying to pull a directory,which it's name contains "."...such as in the image....
Do a test with yourself....place on the main storage path a folder and call it aaa.bbb,you'll see it's buggy...
I've investigated into the PullFolderAsyncInternal
function,and I've see there's a bug in the remotePath = LinuxPath.Combine(remotePath, stat.Path);
line,where it's split the path by dots,and recognize the dot as a folder....
So what? ConsoleApp.zip
https://github.com/SharpAdb/AdvancedSharpAdbClient/assets/27689196/5dbda1bc-0d90-4fa9-83a2-c89b227fcf22
@wherewhere I'm sorry,I'll be more specfic and focus the bug,in the sdcard it's indeed work,but try to pull a file from the "/sdcard/Android/data/xxxx"(any folder here-which are the external data folders for apps),you'll encouteer a bug. I've tried to pull the outer folder,i.e "/sdcard/Android/data/",and I see it's pulling the main android root dir....
This is Android promission issue. I don't know how to fix it.
@wherewhere hey bro,it's defintely nor android permission issue....because when you use this : adb pull /sdcard/android/data/com.globile.mycontactbackup/files
in normal adb clil.... it works as charm... :(
Why your markdown is so weird? The code block is not on codes...
I still have no idea, you can use adb command line by List<string> IAdbCommandLineClient.ExecuteAdbCommand(string command)
@wherewhere thanks for solution sir,how can I involve that line in my code?
How to get the IAdbCommandLineClient
interface?
So why not just use Process
to invoke commands...
@wherewhere cmon...please....
It's better to use Process
because List<string> IAdbCommandLineClient.ExecuteAdbCommand(string command)
set to force exit after 5s.
@wherewhere thanks sir....appriciate it. If there would be a fix in the next versions I would like to know :)