Последнее измененное свойство при потоковой передаче файла на внешний сервер SharePoint

В настоящее время я работаю со службой Windows, которая перемещает файлы из определенных мест и синхронизирует их с библиотеками документов SharePoint.

Функции загрузки/синхронизации/и т. д. работают нормально, но у меня возникают проблемы со свойствами файла. При загрузке (пример кода ниже) для свойства LastModified файлов устанавливается время загрузки файла. Это не тот случай, если я напрямую копирую/вставляю файл в каталог.

Я рассматривал возможность просто изменить свойство после его загрузки, но это не идеально. Судя по тестированию, это вызвано тем, что поток «построен» как новый файл на другом конце? Есть ли способ отправить свойства файла вместе с файлом?

public static string UploadFile(string destUrl, string sourcePath, CredentialCache cc)
{
    try
    {
        Uri destUri = new Uri(destUrl);
        FileStream inStream = File.OpenRead(sourcePath);
        WebRequest req = WebRequest.Create(destUri);
        req.Method = "PUT";
        req.Headers.Add("Overwrite", "F");
        req.Timeout = System.Threading.Timeout.Infinite;
        req.Credentials = cc;
        Stream outStream = req.GetRequestStream();
        byte[] buffer = new byte[32768];
        int read;
        while ((read = inStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            outStream.Write(buffer, 0, read);
        }
        outStream.Flush();
        outStream.Close();
        inStream.Flush();
        inStream.Close();
        WebResponse ores = req.GetResponse();
        ores.Close();
        return "success";          
    } //End Try for Try/Catch of UploadFile()
    catch (Exception ex)
    {
        return ex.Message;
    } //End Try/Catch for UploadFile()
} //End UploadFile()

ИЗМЕНИТЬ – Дополнительная информация

Подводя итог комментарию, который я оставил в ответе ниже:

Я также заметил, поскольку я опубликовал вопрос, что Sharepoint перечисляет информацию как новую, даже если вы напрямую копируете ее, поскольку она основана на информации из базы данных (я полагаю?). Я просмотрел File.SetLastWriteTime, но кажется, что SharePoint не любит, когда я что-то трогаю.

Я также пытался установить черты и загружать файлы с помощью вызовов SharePoint, но, поскольку я отправляю сообщения во внешний экземпляр SharePoint, я не могу пройти аутентификацию, если не пойду по маршруту WebRequest.


person sealz    schedule 27.09.2013    source источник


Ответы (1)


Функции загрузки/синхронизации/и т. д. работают нормально, но у меня возникают проблемы со свойствами файла. При загрузке (пример кода ниже) для свойства LastModified файлов устанавливается время загрузки файла. Это не тот случай, если я напрямую копирую/вставляю файл в каталог.

В этом есть смысл. Попробуйте это, откройте новый экземпляр проводника Windows, выберите файл, скопируйте его, вставьте. Даты создания и доступа в новом файле будут сегодняшней датой и временем, но измененная дата будет соответствовать исходной.

Когда вы загружаете файл, вы создаете совершенно новую копию без метаданных, поэтому даты изменения и создания будут соответствовать сегодняшним дате и времени.

Что вы можете сделать, когда файл находится на сервере и вы можете получить к нему доступ, так это использовать File.SetLastWriteTime для ручной установки атрибута. (См. документацию по SetLastWriteTime).

Надеюсь, это поможет.

Редактировать 1. Вы можете просмотреть свою коллекцию файлов в Sharepoint и установить атрибуты для новых файлов, выполнив что-то вроде этого:

var list = web.Lists[new Guid("...")];
var folderItem = list.RootFolder.SubFolders;

foreach (File f in files) {
    var lastModifiedBy = context.Web.EnsureUser(f.LastModifiedBy);
    var lastModified = f.LastModified;
    SPFile uploadedFile = folderItem.Files.Add(f.FileName, f.Content, lastModifiedBy,
                          lastModifiedBy, lastModified, lastModified);
    uploadedFile.Item["Created"] = lastModified;
    uploadedFile.Item["Modified"] = lastModified;
    uploadedFile.Item.UpdateOverwriteVersion();
}
person Mike P.    schedule 07.10.2013
comment
Спасибо за ответ. Это подтверждает то, что я думал о метках времени. Я также заметил, что с тех пор, как опубликовал вопрос, Sharepoint перечисляет информацию как новую, даже если вы напрямую копируете ее, поскольку она основана на информации из базы данных. Я просмотрел File.SetLastWriteTime, но кажется, что SharePoint не любит, когда я что-то трогаю. (Редактирование моего вопроса для включения дополнительной информации) - person sealz; 08.10.2013
comment
Вы можете вручную просмотреть файлы в Sharepoint и установить атрибуты. Я обновлю свой пост, чтобы отразить это. - person Mike P.; 08.10.2013
comment
Спасибо. Проблема с циклическим управлением файлами SP заключается в том, что я не могу аутентифицироваться, так как я синхронизирую файлы извне. Если нет способа, которым я упускаю из виду, я, похоже, не могу аутентифицироваться с помощью вызовов SP. - person sealz; 09.10.2013
comment
Ой вей! Может пора обновиться? :P Так что да, вы застряли, используя WebRequest и NetworkCredentials. Попробуйте сделать новый запрос и выполнить request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; для аутентификации, посмотрите, получится ли у вас. - person Mike P.; 09.10.2013
comment
Я пробовал сетевые учетные данные по умолчанию. Это работает, если я нахожусь в домене, в котором работает точка доступа. Однако я пытаюсь загрузить в другой домен с другим именем пользователя и паролем. Эта часть работает нормально, у меня просто нет возможности изменить временные метки (из внутреннего приложения) после того, как файлы будут размещены извне. 2010 год в работе. Некоторые экземпляры просто не получили любви .. а некоторые не получат :( - person sealz; 09.10.2013
comment
У меня было ощущение, что это может не работать из-за пределов домена. Прости! Хотел бы я быть более полезным. - person Mike P.; 09.10.2013
comment
После исследования у меня также сложилось впечатление, что невозможно пройти аутентификацию в SP с помощью вызовов SP, когда ваш входной поток поступает из другого домена (что было бы единственным способом изменить время модификации SP). Я что-то упустил или это, к сожалению, верно? - person sealz; 09.10.2013
comment
Похоже, вы добрались до моего последнего вопроса, прежде чем я его опубликовал. Спасибо за обсуждение. - person sealz; 09.10.2013