nickdu088 / SharpExt4

A .Net library to provide full access (read/write) to Linux ext2/ext3/ext4 filesystem
https://www.nickdu.com/?p=890
40 stars 8 forks source link

Open multiple image #6

Closed Giacomo-Gozzi closed 2 years ago

Giacomo-Gozzi commented 2 years ago

I would need to copy some files from one ext4 disk to another. The problem is that when I try to open the second image if I haven't dispose of the first one first an exception is thrown.

 var d1 = ExtDisk.Open(@"C:\Users\Giacomo\Downloads\raspbian_1.img");
 var fs1 = ExtFileSystem.Open(d1.Partitions[1]);
 //d1.Dispose(); //with this line code working but i cant copy file

 var d2 = ExtDisk.Open(@"C:\Users\Giacomo\Downloads\raspbian_2.img");
 var fs2 = ExtFileSystem.Open(d2.Partitions[1]);
nickdu088 commented 2 years ago

What exception did you receive? I haven't tried two images at the same time. One temp solution is to save the files to your local drive and then transfer to the new image

Giacomo-Gozzi commented 2 years ago

I tried saving them to the local disk but I would need to keep the file permissions, that way they are lost.

There are two kinds of exceptions(I assume there is a static pointer used by both):

1) Could not read disk MBR

var d1 = ExtDisk.Open(@"C:\Users\Giacomo\Downloads\raspbian_1.img");
var fs1 = ExtFileSystem.Open(d1.Partitions[1]);
var d2 = ExtDisk.Open(@"C:\Users\Giacomo\Downloads\raspbian_2.img");
var fs2 = ExtFileSystem.Open(d2.Partitions[1]);

The exception is generated at line 3

2) Could not register partition.

var d1 = ExtDisk.Open(@"C:\Users\Giacomo\Downloads\raspbian_1.img");
var d2 = ExtDisk.Open(@"C:\Users\Giacomo\Downloads\raspbian_2.img");
var fs1 = ExtFileSystem.Open(d1.Partitions[1]);
var fs2 = ExtFileSystem.Open(d2.Partitions[1]);

The exception is generated at line 4

nickdu088 commented 2 years ago

Probably yes.

When you transfer the file, keeping file permissions in a Dictionary<path, permission> in the memory, after the transfer, you can use setmode to set the original permission.

Giacomo-Gozzi commented 2 years ago

Yes of course but it would be much more convenient to move files directly between images.

Do you think it would be possible to fix the problem?

nickdu088 commented 2 years ago

I need take a look.

nickdu088 commented 2 years ago

Yes of course but it would be much more convenient to move files directly between images.

Do you think it would be possible to fix the problem?

This is the limitation of lew4. It only can take one disk image at a time, because the underline implementation is C. All variables are global variable and shared across the library.

Giacomo-Gozzi commented 2 years ago

I tried to view the code, are you sure it is not a SharpExt4 problem? I noticed that in the ExtDisk.cpp file on line 56

auto disk = gcnew ExtDisk(imagePath);

disk->bd always has the same pointer, they seem to me declared satatic in the io_raw.cpp file

nickdu088 commented 2 years ago

I tried to view the code, are you sure it is not a SharpExt4 problem? I noticed that in the ExtDisk.cpp file on line 56

auto disk = gcnew ExtDisk(imagePath);

disk->bd always has the same pointer, they seem to me declared satatic in the io_raw.cpp file

I have done the quick fix. It seems working ok on my side. Let me know if you still have the issue.

Giacomo-Gozzi commented 2 years ago

It now allows you to open two filesystems, the problem is that it always displays the last opened disk.

var disk1 = ExtDisk.Open(@".\disk1.img");
var disk2 = ExtDisk.Open(@".\disk2.img");

var fs1 = ExtFileSystem.Open(disk1.Partitions[1]);
ListAllFiles(fs1);
CreateFile(fs1);

var fs2 = ExtFileSystem.Open(disk2.Partitions[1]);
ListAllFiles(fs2);

ListAllFiles(fs1); View files in disk 2 CreateFile(fs1); Create the file in disk 2

In my project, the same pointer for ExtDisk.bd always remains.

nickdu088 commented 2 years ago

It now allows you to open two filesystems, the problem is that it always displays the last opened disk.

var disk1 = ExtDisk.Open(@".\disk1.img");
var disk2 = ExtDisk.Open(@".\disk2.img");

var fs1 = ExtFileSystem.Open(disk1.Partitions[1]);
ListAllFiles(fs1);
CreateFile(fs1);

var fs2 = ExtFileSystem.Open(disk2.Partitions[1]);
ListAllFiles(fs2);

ListAllFiles(fs1); View files in disk 2 CreateFile(fs1); Create the file in disk 2

In my project, the same pointer for ExtDisk.bd always remains.

Hope this time, this issue get fixed. I did a quick test, and it's working. The ExtFileSystem.Open API has been updated.

Giacomo-Gozzi commented 2 years ago

Perfect everything seems to be working correctly, many thanks