Thanks for your resend.
I understand your advice.
Then my project read many times 'ReadFile' method.
Your sample didn't call 'ReadFile' method before did not open file.
I made 'CreateFile' method on your 'CreateFile' method.
Why my project called this Method?
I send my source. Can you check my source??..
manager is my sftp control class.
private string GetPath(string fileName)
{
return "/" + fileName.Replace(@"\", "/");
}
public NtStatus CreateFile(string fileName, DokanNet.FileAccess access, FileShare share, FileMode mode, FileOptions options, FileAttributes attributes, IDokanFileInfo info)
{
fileName = GetPath(fileName);
try
{
if (info.IsDirectory)
{
switch (mode)
{
case FileMode.Open:
try
{
if (manager.IsDirectory(fileName))
return NtStatus.Success;
else
return NtStatus.ObjectPathNotFound;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return NtStatus.ObjectPathNotFound;
}
case FileMode.CreateNew:
try
{
if (manager.MakeDirectory(fileName))
return NtStatus.Success;
else
return NtStatus.Error;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return NtStatus.Error;
}
default:
return NtStatus.Error;
}
}
else
{
switch (mode)
{
case FileMode.Open:
if (manager.IsExist(fileName))
return NtStatus.Success;
else
return NtStatus.ObjectPathNotFound;
case FileMode.CreateNew:
if (manager.IsExist(fileName))
return NtStatus.ObjectNameCollision;
return NtStatus.Success;
case FileMode.Create:
return NtStatus.Success;
case FileMode.OpenOrCreate:
return NtStatus.Success;
case FileMode.Truncate:
if (!manager.IsExist(fileName))
return NtStatus.ObjectNameNotFound;
return NtStatus.Success;
case FileMode.Append:
if (manager.IsExist(fileName))
return NtStatus.Success;
return NtStatus.Success;
default:
return NtStatus.Error;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString() + "---------------");
return NtStatus.ObjectPathNotFound;
}
}
public NtStatus FindFiles(string fileName, out IList<FileInformation> files, IDokanFileInfo info)
{
fileName = GetPath(fileName);
files = new List<FileInformation>();
var fileList = manager.FindFiles(fileName);
try
{
foreach (FileInfos fileInfo in fileList)
{
FileInformation fi = new FileInformation
{
Attributes = Path.HasExtension(fileInfo.FileName) ? FileAttributes.Normal : FileAttributes.Directory,
FileName = fileInfo.FileName,
Length = fileInfo.Length,
LastWriteTime = fileInfo.LastWriteTime,
LastAccessTime = fileInfo.LastAccessTime,
CreationTime = fileInfo.CreationTime
};
if (fi.FileName.StartsWith("."))
{
fi.Attributes |= FileAttributes.Hidden;
}
files.Add(fi);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString() + "---------------");
}
return NtStatus.Success;
}
public NtStatus GetFileInformation(string fileName, out FileInformation fileInfo, IDokanFileInfo info)
{
fileName = GetPath(fileName);
fileInfo = new FileInformation();
try
{
FileInfos infos = manager.GetFileInfo(fileName);
fileInfo.FileName = infos.FileName;
fileInfo.Attributes = Path.HasExtension(fileInfo.FileName) ? FileAttributes.Normal : FileAttributes.Directory;
fileInfo.Length = infos.Length;
fileInfo.CreationTime = infos.CreationTime;
fileInfo.LastAccessTime = infos.LastAccessTime;
fileInfo.LastWriteTime = infos.LastWriteTime;
}
catch (SftpException ex)
{
Console.WriteLine(ex.ToString() + "---------------");
return NtStatus.Error;
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
return NtStatus.Error;
}
return NtStatus.Success;
}
public NtStatus ReadFile(string fileName, byte[] buffer, out int bytesRead, long offset, IDokanFileInfo info)
{
bytesRead = 0;
if (info.IsDirectory)
return NtStatus.Error;
if (info.IsDirectory)
return NtStatus.Error;
fileName = GetPath(fileName);
try
{
buffer = manager.ReadFile(fileName);
bytesRead = buffer.Length;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
return NtStatus.Success;
}
2020년 10월 8일 목요일 오후 4시 5분 50초 UTC+9에 Liryna님이 작성: